default.go raw

   1  package providers
   2  
   3  import (
   4  	"fmt"
   5  	"os"
   6  	"strings"
   7  )
   8  
   9  type DefaultCredentialsProvider struct {
  10  	providerChain    []CredentialsProvider
  11  	lastUsedProvider CredentialsProvider
  12  }
  13  
  14  func NewDefaultCredentialsProvider() (provider *DefaultCredentialsProvider) {
  15  	providers := []CredentialsProvider{}
  16  
  17  	// Add static ak or sts credentials provider
  18  	envProvider, err := NewEnvironmentVariableCredentialsProviderBuilder().Build()
  19  	if err == nil {
  20  		providers = append(providers, envProvider)
  21  	}
  22  
  23  	// oidc check
  24  	oidcProvider, err := NewOIDCCredentialsProviderBuilder().Build()
  25  	if err == nil {
  26  		providers = append(providers, oidcProvider)
  27  	}
  28  
  29  	// cli credentials provider
  30  	cliProfileProvider, err := NewCLIProfileCredentialsProviderBuilder().Build()
  31  	if err == nil {
  32  		providers = append(providers, cliProfileProvider)
  33  	}
  34  
  35  	// profile credentials provider
  36  	profileProvider, err := NewProfileCredentialsProviderBuilder().Build()
  37  	if err == nil {
  38  		providers = append(providers, profileProvider)
  39  	}
  40  
  41  	// Add IMDS
  42  	ecsRamRoleProvider, err := NewECSRAMRoleCredentialsProviderBuilder().Build()
  43  	if err == nil {
  44  		providers = append(providers, ecsRamRoleProvider)
  45  	}
  46  
  47  	// credentials uri
  48  	if os.Getenv("ALIBABA_CLOUD_CREDENTIALS_URI") != "" {
  49  		credentialsUriProvider, err := NewURLCredentialsProviderBuilder().Build()
  50  		if err == nil {
  51  			providers = append(providers, credentialsUriProvider)
  52  		}
  53  	}
  54  
  55  	return &DefaultCredentialsProvider{
  56  		providerChain: providers,
  57  	}
  58  }
  59  
  60  func (provider *DefaultCredentialsProvider) GetCredentials() (cc *Credentials, err error) {
  61  	if provider.lastUsedProvider != nil {
  62  		inner, err1 := provider.lastUsedProvider.GetCredentials()
  63  		if err1 != nil {
  64  			err = err1
  65  			return
  66  		}
  67  
  68  		providerName := inner.ProviderName
  69  		if providerName == "" {
  70  			providerName = provider.lastUsedProvider.GetProviderName()
  71  		}
  72  
  73  		cc = &Credentials{
  74  			AccessKeyId:     inner.AccessKeyId,
  75  			AccessKeySecret: inner.AccessKeySecret,
  76  			SecurityToken:   inner.SecurityToken,
  77  			ProviderName:    fmt.Sprintf("%s/%s", provider.GetProviderName(), providerName),
  78  		}
  79  		return
  80  	}
  81  
  82  	errors := []string{}
  83  	for _, p := range provider.providerChain {
  84  		provider.lastUsedProvider = p
  85  		inner, errInLoop := p.GetCredentials()
  86  		if errInLoop != nil {
  87  			errors = append(errors, errInLoop.Error())
  88  			// 如果有错误,进入下一个获取过程
  89  			continue
  90  		}
  91  
  92  		if inner != nil {
  93  			providerName := inner.ProviderName
  94  			if providerName == "" {
  95  				providerName = p.GetProviderName()
  96  			}
  97  			cc = &Credentials{
  98  				AccessKeyId:     inner.AccessKeyId,
  99  				AccessKeySecret: inner.AccessKeySecret,
 100  				SecurityToken:   inner.SecurityToken,
 101  				ProviderName:    fmt.Sprintf("%s/%s", provider.GetProviderName(), providerName),
 102  			}
 103  			return
 104  		}
 105  	}
 106  
 107  	err = fmt.Errorf("unable to get credentials from any of the providers in the chain: %s", strings.Join(errors, ", "))
 108  	return
 109  }
 110  
 111  func (provider *DefaultCredentialsProvider) GetProviderName() string {
 112  	return "default"
 113  }
 114