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  }