func GetRegistryRefreshToken()

in tokenutil/token_util.go [34:75]


func GetRegistryRefreshToken(registry, resourceID, clientID string) (string, error) {
	armToken, err := GetRefreshAuthToken(resourceID, clientID)
	if err != nil {
		return "", errors.Wrap(err, "unable to get ARM token")
	}

	client := autorest.NewClientWithUserAgent("azure/acr/tasks")
	exchangeURL := fmt.Sprintf("https://%s/oauth2/exchange", registry)

	v := url.Values{}
	v.Set("grant_type", "access_token")
	v.Set("service", registry)
	v.Set("access_token", armToken.AccessToken)

	req, err := http.NewRequest("POST", exchangeURL, strings.NewReader(v.Encode()))
	if err != nil {
		return "", errors.Wrap(err, "unable to create the request to get ACR refresh token")
	}
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

	response, err := client.Do(req)
	if err != nil {
		return "", errors.Wrap(err, "unable to send the request to get ACR refresh token")
	}

	defer response.Body.Close()

	if response.StatusCode != http.StatusOK {
		return "", fmt.Errorf("failed to get ACR refresh token, exchange API response code: %s", response.Status)
	}

	var token RegistryRefreshToken
	jsonResponse, err := io.ReadAll(response.Body)
	if err != nil {
		return "", errors.Wrap(err, "unable to read the response from ACR exchange API")
	}
	err = json.Unmarshal(jsonResponse, &token)
	if err != nil {
		return "", errors.Wrapf(err, "unable to parse the response from ACR exchange API: %s", jsonResponse)
	}
	return token.RefreshToken, nil
}