in internal/apiclient/token.go [99:164]
func generateAccessToken(privateKey string) (string, error) {
const grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer"
var respBody []byte
// oAuthAccessToken is a structure to hold OAuth response
type oAuthAccessToken struct {
AccessToken string `json:"access_token,omitempty"`
ExpiresIn int `json:"expires_in,omitempty"`
TokenType string `json:"token_type,omitempty"`
}
token, err := generateJWT(privateKey)
if err != nil {
return "", nil
}
form := url.Values{}
form.Add("grant_type", grantType)
form.Add("assertion", token)
client := &http.Client{}
req, err := http.NewRequest("POST", tokenUri, strings.NewReader(form.Encode()))
if err != nil {
clilog.Error.Println("error in client: ", err)
return "", err
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
req.Header.Add("Content-Length", strconv.Itoa(len(form.Encode())))
resp, err := client.Do(req)
if err != nil {
clilog.Error.Println("failed to generate oauth token: ", err)
return "", err
}
if resp != nil {
defer resp.Body.Close()
}
if resp == nil {
clilog.Error.Println("error in response: Response was null")
return "", errors.New("error in response: Response was null")
}
respBody, err = io.ReadAll(resp.Body)
clilog.Debug.Printf("Response: %s\n", string(respBody))
if err != nil {
clilog.Error.Printf("error in response: %v\n", err)
return "", err
} else if resp.StatusCode > 399 {
clilog.Error.Printf("status code %d, error in response: %s\n", resp.StatusCode, string(respBody))
return "", fmt.Errorf("status code %d, error in response: %s", resp.StatusCode, string(respBody))
}
accessToken := oAuthAccessToken{}
if err = json.Unmarshal(respBody, &accessToken); err != nil {
return "", err
}
clilog.Debug.Println("access token : ", accessToken)
SetIntegrationToken(accessToken.AccessToken)
_ = writeToken(accessToken.AccessToken)
return accessToken.AccessToken, nil
}