开发者社区 问答 正文

Go-SDK之如何实现授权访问?


使用URL签名授权访问


通过生成签名URL的形式提供给用户一个临时的访问URL。在生成URL时,您可以指定URL过期的时间,从而限制用户长时间访问。


提示:
  • 以下场景的完整代码请参考:GitHub


使用私有的下载链接


生成GetObject的签名url示例如下: package main
import (
    "fmt"
    "io/ioutil"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
    // Handle Error
}
func main() {
    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        HandleError(err)
    }
    bucket, err := client.Bucket("BucketName")
    if err != nil {
        HandleError(err)
    }
    // get object
    signedURL, err := bucket.SignURL("ObjectName", oss.HTTPGet, 60)
    if err != nil {
        HandleError(err)
    }
    body, err := bucket.GetObjectWithURL(signedURL)
    if err != nil {
        HandleError(err)
    }
    // read content
    data, err := ioutil.ReadAll(body)
    body.Close()
    data = data // use data
    err = bucket.GetObjectToFileWithURL(signedURL, "localFile")
    if err != nil {
        HandleError(err)
    }
}


提示:
  • 生成的URL可以直接通过浏览器访问相关内容。


使用私有的上传链接


如果您想允许用户临时进行其它操作(比如上传,删除文件),可能需要签名其它方法的URL,如下: package main
import (
    "fmt"
    "strings"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
    // Handle Error
}
func main() {
    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
    if err != nil {
        HandleError(err)
    }
    bucket, err := client.Bucket("BucketName")
    if err != nil {
        HandleError(err)
    }
    // put object
    signedURL, err := bucket.SignURL("ObjectName", oss.HTTPPut, 60)
    if err != nil {
        HandleError(err)
    }
    var val = "花间一壶酒,独酌无相亲。 举杯邀明月,对影成三人。"
    err = bucket.PutObjectWithURL(signedURL, strings.NewReader(val))
    if err != nil {
        HandleError(err)
    }
    // put object with option
    options := []oss.Option{
        oss.Meta("myprop", "mypropval"),
        oss.ContentType("image/tiff"),
    }
    signedURL, err = bucket.SignURL("ObjectName", oss.HTTPPut, 60, options...)
    if err != nil {
        HandleError(err)
    }
    err = bucket.PutObjectFromFileWithURL(signedURL, "localFile", options...)
    if err != nil {
        HandleError(err)
    }
}



临时凭证(STS)上传和下载



介绍


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

使用STS凭证创建OssClient


用户的client端拿到STS临时凭证后,通过其中安全令牌(SecurityToken)以及临时访问密钥(AccessKeyId, AccessKeySecret)生成Client。
通过下面代码可以使用STS临时凭证创建Client: package main
import (
    "bytes"
    "fmt"
    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
    // Handle Error
}
func main() {
    client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret", oss.SecurityToken("StsToken"))
    if err != nil {
        HandleError(err)
    }
    bucket, err := client.Bucket("BucketName")
    if err != nil {
        HandleError(err)
    }
    err = bucket.PutObject("my-object", bytes.NewReader([]byte("MyObjectValue")))
    if err != nil {
        HandleError(err)
    }
    fmt.Printf("Completed\n")
}

展开
收起
青衫无名 2017-10-19 14:33:35 2232 分享 版权
0 条回答
写回答
取消 提交回答