github.com/mondo192/jfrog-client-go@v1.0.0/access/services/accesstoken.go (about)

     1  package services
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"github.com/mondo192/jfrog-client-go/artifactory/services/utils"
     7  	"github.com/mondo192/jfrog-client-go/auth"
     8  	"github.com/mondo192/jfrog-client-go/http/jfroghttpclient"
     9  	"github.com/mondo192/jfrog-client-go/utils/errorutils"
    10  	"github.com/mondo192/jfrog-client-go/utils/io/httputils"
    11  	"net/http"
    12  )
    13  
    14  // #nosec G101 -- False positive - no hardcoded credentials.
    15  const tokensApi = "api/v1/tokens"
    16  
    17  type TokenService struct {
    18  	client         *jfroghttpclient.JfrogHttpClient
    19  	ServiceDetails auth.ServiceDetails
    20  }
    21  
    22  type CreateTokenParams struct {
    23  	auth.CommonTokenParams
    24  }
    25  
    26  func NewCreateTokenParams(params auth.CommonTokenParams) CreateTokenParams {
    27  	return CreateTokenParams{CommonTokenParams: params}
    28  }
    29  
    30  func NewTokenService(client *jfroghttpclient.JfrogHttpClient) *TokenService {
    31  	return &TokenService{client: client}
    32  }
    33  
    34  func (ps *TokenService) CreateAccessToken(params CreateTokenParams) (auth.CreateTokenResponseData, error) {
    35  	return ps.createAccessToken(params)
    36  }
    37  
    38  func (ps *TokenService) RefreshAccessToken(token auth.CommonTokenParams) (auth.CreateTokenResponseData, error) {
    39  	param, err := createRefreshTokenRequestParams(token)
    40  	if err != nil {
    41  		return auth.CreateTokenResponseData{}, err
    42  	}
    43  	return ps.createAccessToken(*param)
    44  }
    45  
    46  // createAccessToken is used to create & refresh access tokens.
    47  func (ps *TokenService) createAccessToken(params CreateTokenParams) (auth.CreateTokenResponseData, error) {
    48  	// Set the request headers
    49  	tokenInfo := auth.CreateTokenResponseData{}
    50  	httpDetails := ps.ServiceDetails.CreateHttpClientDetails()
    51  	utils.SetContentType("application/json", &httpDetails.Headers)
    52  	err := ps.addAccessTokenAuthorizationHeader(params, &httpDetails)
    53  	if err != nil {
    54  		return tokenInfo, err
    55  	}
    56  	requestContent, err := json.Marshal(params)
    57  	if errorutils.CheckError(err) != nil {
    58  		return tokenInfo, err
    59  	}
    60  	url := fmt.Sprintf("%s%s", ps.ServiceDetails.GetUrl(), tokensApi)
    61  	resp, body, err := ps.client.SendPost(url, requestContent, &httpDetails)
    62  	if err != nil {
    63  		return tokenInfo, err
    64  	}
    65  	if err = errorutils.CheckResponseStatusWithBody(resp, body, http.StatusOK); err != nil {
    66  		return tokenInfo, err
    67  	}
    68  	err = json.Unmarshal(body, &tokenInfo)
    69  	return tokenInfo, errorutils.CheckError(err)
    70  }
    71  
    72  func (ps *TokenService) addAccessTokenAuthorizationHeader(params CreateTokenParams, httpDetails *httputils.HttpClientDetails) error {
    73  	access := ps.ServiceDetails.GetAccessToken()
    74  	if access == "" {
    75  		access = params.AccessToken
    76  	}
    77  	if access == "" {
    78  		return errorutils.CheckErrorf("failed: adding accessToken authorization, but No accessToken was provided. ")
    79  	}
    80  	utils.AddHeader("Authorization", fmt.Sprintf("Bearer %s", access), &httpDetails.Headers)
    81  	return nil
    82  }
    83  
    84  func createRefreshTokenRequestParams(p auth.CommonTokenParams) (*CreateTokenParams, error) {
    85  	var trueValue = true
    86  	// Validate provided parameters
    87  	if p.RefreshToken == "" {
    88  		return nil, errorutils.CheckErrorf("error: trying to refresh token, but 'refresh_token' field wasn't provided. ")
    89  	}
    90  	params := NewCreateTokenParams(p)
    91  	// Set refresh required parameters
    92  	params.GrantType = "refresh_token"
    93  	params.Refreshable = &trueValue
    94  	return &params, nil
    95  }