本文介绍如何进行授权访问。

使用签名URL进行临时授权

您可以将生成的签名URL提供给访客进行临时访问。生成签名URL时,您可以指定URL的过期时间,来限制访客的访问时长。

使用签名URL进行临时授权的完整代码请参见GitHub

  • 使用签名URL上传文件
    以下代码用于使用签名URL上传文件:
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "strings"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. func HandleError(err error) {
  9. fmt.Println("Error:", err)
  10. os.Exit(-1)
  11. }
  12. func main() {
  13. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  14. if err != nil {
  15. HandleError(err)
  16. }
  17. bucketName := "<yourBucketName>"
  18. objectName := "<yourObjectName>"
  19. localFilename := "<yourLocalFilename>"
  20. // 获取存储空间。
  21. bucket, err := client.Bucket(bucketName)
  22. if err != nil {
  23. HandleError(err)
  24. }
  25. // 签名直传。
  26. signedURL, err := bucket.SignURL(objectName, oss.HTTPPut, 60)
  27. if err != nil {
  28. HandleError(err)
  29. }
  30. var val = "上云就上阿里云"
  31. err = bucket.PutObjectWithURL(signedURL, strings.NewReader(val))
  32. if err != nil {
  33. HandleError(err)
  34. }
  35. // 带可选参数的签名直传。
  36. options := []oss.Option{
  37. oss.Meta("myprop", "mypropval"),
  38. oss.ContentType("image/tiff"),
  39. }
  40. signedURL, err = bucket.SignURL(objectName, oss.HTTPPut, 60, options...)
  41. if err != nil {
  42. HandleError(err)
  43. }
  44. err = bucket.PutObjectFromFileWithURL(signedURL, localFilename, options...)
  45. if err != nil {
  46. HandleError(err)
  47. }
  48. }

说明 可选参数详情请参见管理文件中的文件元信息

  • 使用签名URL下载文件
    以下代码用于使用签名URL下载文件:
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "io/ioutil"
  6. "github.com/aliyun/aliyun-oss-go-sdk/oss"
  7. )
  8. func HandleError(err error) {
  9. fmt.Println("Error:", err)
  10. os.Exit(-1)
  11. }
  12. func main() {
  13. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>")
  14. if err != nil {
  15. HandleError(err)
  16. }
  17. bucketName := "<yourBucketName>"
  18. objectName := "<yourObjectName>"
  19. localDownloadedFilename := "<yourDownloadedFilename>"
  20. // 获取存储空间。
  21. bucket, err := client.Bucket(bucketName)
  22. if err != nil {
  23. HandleError(err)
  24. }
  25. // 签名直传,下载到流。
  26. signedURL, err := bucket.SignURL(objectName, oss.HTTPGet, 60)
  27. if err != nil {
  28. HandleError(err)
  29. }
  30. body, err := bucket.GetObjectWithURL(signedURL)
  31. if err != nil {
  32. HandleError(err)
  33. }
  34. // 读取内容。
  35. data, err := ioutil.ReadAll(body)
  36. body.Close()
  37. data = data // use data
  38. // 签名直传,下载到文件。
  39. err = bucket.GetObjectToFileWithURL(signedURL, localDownloadedFilename)
  40. if err != nil {
  41. HandleError(err)
  42. }
  43. }

使用STS进行临时授权

OSS可以通过阿里云STS (Security Token Service) 进行临时授权访问。阿里云STS是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。STS更详细的解释请参见STS介绍

STS的优势如下:

  • 您无需透露您的长期密钥(AccessKey)给第三方应用,只需生成一个访问令牌并将令牌交给第三方应用。您可以自定义这个令牌的访问权限及有效期限。
  • 您无需关心权限撤销问题,访问令牌过期后自动失效。
    使用STS访问OSS的流程请参见开发指南中的RAM和STS应用场景实践

以下代码用于使用STS凭证构造签名请求:

  1. import "github.com/aliyun/aliyun-oss-go-sdk/oss"
  2. // 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。
  3. // 创建OSSClient实例。
  4. client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>", oss.SecurityToken("<yourSecurityToken>"))
  5. if err != nil {
  6. fmt.Println("Error:", err)
  7. os.Exit(-1)
  8. // OSS操作。
  9. }