in pkg/sts/sts.go [172:205]
func (s *STS) TokenFederated(ctx context.Context, k8sSAjwt string) (string, error) {
stsAud := s.constructAudience("", s.kr.TrustDomain)
jsonStr, err := s.constructFederatedTokenRequest(stsAud, k8sSAjwt)
if err != nil {
return "", fmt.Errorf("failed to marshal federated token request: %v", err)
}
req, err := http.NewRequest("POST", SecureTokenEndpoint, bytes.NewBuffer(jsonStr))
req = req.WithContext(ctx)
res, err := s.httpClient.Do(req)
if err != nil {
return "", fmt.Errorf("token exchange failed: %v, (aud: %s, STS endpoint: %s)", err, stsAud, SecureTokenEndpoint)
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", fmt.Errorf("token exchange read failed: %v, (aud: %s, STS endpoint: %s)", err, stsAud, SecureTokenEndpoint)
}
respData := &federatedTokenResponse{}
if err := json.Unmarshal(body, respData); err != nil {
// Normally the request should json - extremely hard to debug otherwise, not enough info in status/err
log.Println("Unexpected unmarshal error, response was ", string(body))
return "", fmt.Errorf("(aud: %s, STS endpoint: %s), failed to unmarshal response data of size %v: %v",
stsAud, SecureTokenEndpoint, len(body), err)
}
if respData.AccessToken == "" {
return "", fmt.Errorf(
"exchanged empty token (aud: %s, STS endpoint: %s), response: %v", stsAud, SecureTokenEndpoint, string(body))
}
return respData.AccessToken, nil
}