default.go 2.9 KB

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