in pkg/internal/token/execCredentialPlugin.go [42:87]
func (p *execCredentialPlugin) Do(ctx context.Context) error {
if p.o.ServerID == "" {
return errors.New("server-id is required")
}
ctx, cancel := context.WithTimeout(ctx, p.o.Timeout)
defer cancel()
record, err := p.cachedRecord.Retrieve()
if err != nil {
klog.V(5).Infof("failed to retrieve cached record: %s", err)
}
cred, err := p.newCredentialFunc(record, p.o)
if err != nil {
return fmt.Errorf("failed to create azidentity credential: %w", err)
}
klog.V(5).Infof("using credential: %s", cred.Name())
scopes := []string{GetScope(p.o.ServerID)}
tokenRequestOptions := policy.TokenRequestOptions{
TenantID: p.o.TenantID,
Scopes: scopes,
}
if cred.NeedAuthenticate() && record == (azidentity.AuthenticationRecord{}) {
// No stored record; call Authenticate to acquire one.
// This will prompt the user to authenticate interactively.
klog.V(5).Info("no stored record; calling Authenticate")
record, err = cred.Authenticate(ctx, &tokenRequestOptions)
if err != nil {
return fmt.Errorf("failed to authenticate: %w", err)
}
err = p.cachedRecord.Store(record)
if err != nil {
return fmt.Errorf("failed to store record: %w", err)
}
}
klog.V(5).Infof("getting token with scopes: %v", scopes)
token, err := cred.GetToken(ctx, tokenRequestOptions)
if err != nil {
return fmt.Errorf("failed to get token: %w", err)
}
return p.execCredentialWriter.Write(token, os.Stdout)
}