aliyunStsClient.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package oss
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "go-nc/configs/global"
  7. "time"
  8. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
  9. "github.com/aliyun/alibaba-cloud-sdk-go/services/sts"
  10. )
  11. var ctx = context.Background()
  12. // 获取临时凭证
  13. func GetAliyunStsClientCredential() (interface{}, error) {
  14. // 从 Redis 获取 STS 临时凭证
  15. info, err := global.App.Redis.Get(ctx, "STSServiceValue").Result()
  16. if err == nil && info != "" {
  17. var result interface{}
  18. err = json.Unmarshal([]byte(info), &result)
  19. if err != nil {
  20. return nil, err
  21. }
  22. return result, nil
  23. }
  24. // 如果 Redis 中没有临时凭证,则获取新的 STS 临时凭证
  25. accessKeyId := "LTAI5tBqSRASM72SvDex93CF"
  26. accessKeySecret := "dJJAuwW0TzoHNlHThHPvJboGtrUIXt"
  27. roleArn := "acs:ram::1781427438729339:role/ramosstest"
  28. region := "cn-beijing"
  29. durationSeconds := 3600
  30. // 创建 STS 客户端
  31. client, err := sts.NewClientWithAccessKey(region, accessKeyId, accessKeySecret)
  32. if err != nil {
  33. return nil, fmt.Errorf("failed to create STS client: %v", err)
  34. }
  35. // 创建 AssumeRole 请求
  36. request := sts.CreateAssumeRoleRequest()
  37. request.Scheme = "https"
  38. request.RoleArn = roleArn
  39. request.RoleSessionName = "external-username"
  40. request.DurationSeconds = requests.NewInteger(durationSeconds)
  41. // 获取临时凭证
  42. response, err := client.AssumeRole(request)
  43. if err != nil {
  44. return nil, fmt.Errorf("failed to assume role: %v", err)
  45. }
  46. // 将临时凭证存入 Redis
  47. credentials := response.Credentials
  48. credJSON, err := json.Marshal(credentials)
  49. if err != nil {
  50. return nil, fmt.Errorf("failed to marshal credentials: %v", err)
  51. }
  52. // 设置 Redis 键值,设置一个适当的过期时间
  53. err = global.App.Redis.Set(ctx, "STSServiceValue", credJSON, time.Second*3500).Err()
  54. if err != nil {
  55. return nil, fmt.Errorf("failed to set value in Redis: %v", err)
  56. }
  57. return credentials, nil
  58. }