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 ¶ms, nil 95 }