internal/provider/auth_msi.go (31 lines of code) (raw):
package provider
import (
"context"
"errors"
"time"
"github.com/Azure/azure-sdk-for-go/sdk/azcore"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
)
type MsiCredential struct {
cred *azidentity.ManagedIdentityCredential
}
func NewManagedIdentityCredential(options *azidentity.ManagedIdentityCredentialOptions) (*MsiCredential, error) {
miCred, err := azidentity.NewManagedIdentityCredential(options)
if err != nil {
return nil, err
}
w := &MsiCredential{
cred: miCred,
}
return w, nil
}
func (w *MsiCredential) GetToken(ctx context.Context, opts policy.TokenRequestOptions) (azcore.AccessToken, error) {
c, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
tk, err := w.cred.GetToken(c, opts)
if ctxErr := c.Err(); errors.Is(ctxErr, context.DeadlineExceeded) {
// timeout: signal the chain to try its next credential, if any
err = azidentity.NewCredentialUnavailableError("managed identity timed out")
}
return tk, err
}