in catalog/rest/rest.go [506:557]
func (r *Catalog) fetchAccessToken(cl *http.Client, creds string, opts *options) (string, error) {
clientID, clientSecret, hasID := strings.Cut(creds, ":")
if !hasID {
clientID, clientSecret = "", clientID
}
scope := "catalog"
if opts.scope != "" {
scope = opts.scope
}
data := url.Values{
"grant_type": {"client_credentials"},
"client_id": {clientID},
"client_secret": {clientSecret},
"scope": {scope},
}
uri := opts.authUri
if uri == nil {
uri = r.baseURI.JoinPath("oauth/tokens")
}
rsp, err := cl.PostForm(uri.String(), data)
if err != nil {
return "", err
}
if rsp.StatusCode == http.StatusOK {
defer rsp.Body.Close()
dec := json.NewDecoder(rsp.Body)
var tok oauthTokenResponse
if err := dec.Decode(&tok); err != nil {
return "", fmt.Errorf("failed to decode oauth token response: %w", err)
}
return tok.AccessToken, nil
}
switch rsp.StatusCode {
case http.StatusUnauthorized, http.StatusBadRequest:
defer rsp.Request.GetBody()
dec := json.NewDecoder(rsp.Body)
var oauthErr oauthErrorResponse
if err := dec.Decode(&oauthErr); err != nil {
return "", fmt.Errorf("failed to decode oauth error: %w", err)
}
return "", oauthErr
default:
return "", handleNon200(rsp, nil)
}
}