uri_credential.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package credentials
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "os"
  6. "time"
  7. "github.com/alibabacloud-go/tea/tea"
  8. "github.com/aliyun/credentials-go/credentials/internal/utils"
  9. "github.com/aliyun/credentials-go/credentials/request"
  10. )
  11. // URLCredential is a kind of credential
  12. type URLCredentialsProvider struct {
  13. URL string
  14. *credentialUpdater
  15. *sessionCredential
  16. runtime *utils.Runtime
  17. }
  18. type URLResponse struct {
  19. AccessKeyId string `json:"AccessKeyId" xml:"AccessKeyId"`
  20. AccessKeySecret string `json:"AccessKeySecret" xml:"AccessKeySecret"`
  21. SecurityToken string `json:"SecurityToken" xml:"SecurityToken"`
  22. Expiration string `json:"Expiration" xml:"Expiration"`
  23. }
  24. func newURLCredential(URL string) *URLCredentialsProvider {
  25. credentialUpdater := new(credentialUpdater)
  26. if URL == "" {
  27. URL = os.Getenv("ALIBABA_CLOUD_CREDENTIALS_URI")
  28. }
  29. return &URLCredentialsProvider{
  30. URL: URL,
  31. credentialUpdater: credentialUpdater,
  32. }
  33. }
  34. func (e *URLCredentialsProvider) GetCredential() (*CredentialModel, error) {
  35. if e.sessionCredential == nil || e.needUpdateCredential() {
  36. err := e.updateCredential()
  37. if err != nil {
  38. return nil, err
  39. }
  40. }
  41. credential := &CredentialModel{
  42. AccessKeyId: tea.String(e.sessionCredential.AccessKeyId),
  43. AccessKeySecret: tea.String(e.sessionCredential.AccessKeySecret),
  44. SecurityToken: tea.String(e.sessionCredential.SecurityToken),
  45. Type: tea.String("credential_uri"),
  46. }
  47. return credential, nil
  48. }
  49. // GetAccessKeyId reutrns URLCredential's AccessKeyId
  50. // if AccessKeyId is not exist or out of date, the function will update it.
  51. func (e *URLCredentialsProvider) GetAccessKeyId() (accessKeyId *string, err error) {
  52. c, err := e.GetCredential()
  53. if err != nil {
  54. return
  55. }
  56. accessKeyId = c.AccessKeyId
  57. return
  58. }
  59. // GetAccessSecret reutrns URLCredential's AccessKeySecret
  60. // if AccessKeySecret is not exist or out of date, the function will update it.
  61. func (e *URLCredentialsProvider) GetAccessKeySecret() (accessKeySecret *string, err error) {
  62. c, err := e.GetCredential()
  63. if err != nil {
  64. return
  65. }
  66. accessKeySecret = c.AccessKeySecret
  67. return
  68. }
  69. // GetSecurityToken reutrns URLCredential's SecurityToken
  70. // if SecurityToken is not exist or out of date, the function will update it.
  71. func (e *URLCredentialsProvider) GetSecurityToken() (securityToken *string, err error) {
  72. c, err := e.GetCredential()
  73. if err != nil {
  74. return
  75. }
  76. securityToken = c.SecurityToken
  77. return
  78. }
  79. // GetBearerToken is useless for URLCredential
  80. func (e *URLCredentialsProvider) GetBearerToken() *string {
  81. return tea.String("")
  82. }
  83. // GetType reutrns URLCredential's type
  84. func (e *URLCredentialsProvider) GetType() *string {
  85. return tea.String("credential_uri")
  86. }
  87. func (e *URLCredentialsProvider) updateCredential() (err error) {
  88. if e.runtime == nil {
  89. e.runtime = new(utils.Runtime)
  90. }
  91. request := request.NewCommonRequest()
  92. request.URL = e.URL
  93. request.Method = "GET"
  94. content, err := doAction(request, e.runtime)
  95. if err != nil {
  96. return fmt.Errorf("get credentials from %s failed with error: %s", e.URL, err.Error())
  97. }
  98. var resp *URLResponse
  99. err = json.Unmarshal(content, &resp)
  100. if err != nil {
  101. return fmt.Errorf("get credentials from %s failed with error, json unmarshal fail: %s", e.URL, err.Error())
  102. }
  103. if resp.AccessKeyId == "" || resp.AccessKeySecret == "" || resp.SecurityToken == "" || resp.Expiration == "" {
  104. return fmt.Errorf("get credentials failed: AccessKeyId: %s, AccessKeySecret: %s, SecurityToken: %s, Expiration: %s", resp.AccessKeyId, resp.AccessKeySecret, resp.SecurityToken, resp.Expiration)
  105. }
  106. expirationTime, err := time.Parse("2006-01-02T15:04:05Z", resp.Expiration)
  107. e.lastUpdateTimestamp = time.Now().Unix()
  108. e.credentialExpiration = int(expirationTime.Unix() - time.Now().Unix())
  109. e.sessionCredential = &sessionCredential{
  110. AccessKeyId: resp.AccessKeyId,
  111. AccessKeySecret: resp.AccessKeySecret,
  112. SecurityToken: resp.SecurityToken,
  113. }
  114. return
  115. }