...
1
16 package registry
17
18 import (
19 "context"
20 "fmt"
21 "net/url"
22
23 "github.com/Azure/azure-sdk-for-go/services/preview/containerregistry/runtime/2019-08-15-preview/containerregistry"
24 "github.com/Azure/go-autorest/autorest"
25 "github.com/Azure/go-autorest/autorest/adal"
26 )
27
28
29 func GetRegistryRefreshTokenFromAADExchange(serverURL string, principalToken *adal.ServicePrincipalToken, tenantID string) (string, error) {
30 ctx, cancel := context.WithTimeout(context.Background(), defaultTimeOut)
31 defer cancel()
32
33
34 principalToken.MaxMSIRefreshAttempts = 1
35
36 if err := principalToken.EnsureFreshWithContext(ctx); err != nil {
37 return "", fmt.Errorf("error refreshing sp token - %w", err)
38 }
39
40 registryName, err := getRegistryURL(serverURL)
41 if err != nil {
42 return "", fmt.Errorf("failed to parse server URL - %w", err)
43 }
44 refreshTokenClient := containerregistry.NewRefreshTokensClient(registryName.String())
45 authorizer := autorest.NewBearerAuthorizer(principalToken)
46 refreshTokenClient.Authorizer = authorizer
47 rt, err := refreshTokenClient.GetFromExchange(ctx, "access_token", serverURL, tenantID, "", principalToken.Token().AccessToken)
48 if err != nil {
49 return "", fmt.Errorf("failed to get refresh token for container registry - %w", err)
50 }
51
52 return *rt.RefreshToken, nil
53 }
54
55
56 func getRegistryURL(serverURL string) (*url.URL, error) {
57 sURL, err := url.Parse(secureScheme + serverURL)
58 if err != nil {
59 return &url.URL{}, fmt.Errorf("failed to parse server URL - %w", err)
60 }
61
62 return sURL, nil
63 }
64
View as plain text