github.com/pivotal-cf/go-pivnet/v6@v6.0.2/auth.go (about) 1 package pivnet 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 ) 9 10 type AuthService struct { 11 client Client 12 } 13 14 type UAATokenResponse struct { 15 Token string `json:"access_token"` 16 } 17 18 // Check returns: 19 // true,nil if the auth attempt was succesful, 20 // false,nil if the auth attempt failed for 401 or 403, 21 // false,err if the auth attempt failed for any other reason. 22 // It is guaranteed never to return true,err. 23 func (e AuthService) Check() (bool, error) { 24 url := "/authentication" 25 26 resp, err := e.client.MakeRequest( 27 "GET", 28 url, 29 0, 30 nil, 31 ) 32 if err != nil { 33 return false, err 34 } 35 defer resp.Body.Close() 36 37 switch resp.StatusCode { 38 case http.StatusOK: 39 return true, nil 40 case http.StatusUnauthorized: 41 fallthrough 42 case http.StatusForbidden: 43 return false, nil 44 default: 45 return false, e.client.handleUnexpectedResponse(resp) 46 } 47 } 48 49 func (e AuthService) FetchUAAToken(refresh_token string) (UAATokenResponse, error) { 50 url := "/authentication/access_tokens" 51 52 body := AuthBody{RefreshToken: refresh_token} 53 b, err := json.Marshal(body) 54 if err != nil { 55 return UAATokenResponse{}, err 56 } 57 58 resp, err := e.client.MakeRequest( 59 "POST", 60 url, 61 0, 62 bytes.NewReader(b), 63 ) 64 if err != nil { 65 return UAATokenResponse{}, err 66 } 67 68 if resp.StatusCode != http.StatusOK { 69 return UAATokenResponse{}, fmt.Errorf("failed to fetch UAA token") 70 } 71 72 var response UAATokenResponse 73 err = json.NewDecoder(resp.Body).Decode(&response) 74 if err != nil { 75 return UAATokenResponse{}, err 76 } 77 78 return response, err 79 } 80 81 type AuthBody struct { 82 RefreshToken string `json:"refresh_token"` 83 }