除了使用Authorization Header,您还可以在URL中加入签名信息,以便将该URL转给第三方实现授权访问。
URL中添加签名的Python示例代码:
import base64
import hmac
import hashlib
import urllib
h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV",
"GET\n\n\n1141889120\n/oss-example/oss-api.pdf",
hashlib.sha1)
urllib.quote (base64.encodestring(h.digest()).strip())
OSS SDK中提供了URL签名方法,详细请参见SDK文档。
OSS SDK的URL签名实现,请参看下表:
SDK | URL签名方法 | 实现文件 |
---|---|---|
Java SDK | OSSClient.generatePresignedUrl | OSSClient.java |
Python SDK | Bucket.sign_url | api.py |
.Net SDK | OssClient.GeneratePresignedUri | OssClient.cs |
PHP SDK | OssClient.signUrl | OssClient.php |
JavaScript SDK | signatureUrl | Object.js |
C SDK | oss_gen_signed_url | oss_object.c |
C++ SDK | OssClient::GeneratePresignedUrl | OssClient.cc |
URL签名示例:
http://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2pc56s936**9l&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D
URL签名必须至少包含Signature、Expires和OSSAccessKeyId三个参数。生成签名字符串时,除Date被替换成Expires参数外,仍然包含content-type、content-md5等在Header中包含签名中定义的Header(请求中虽然仍有Date这个请求Header,但不需要将Date加入签名字符串中)。
Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ CONTENT-MD5 + "\n"
+ CONTENT-TYPE + "\n"
+ EXPIRES + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource)))
CONTENT-MD5
、CanonicalizedOSSHeaders
、CONTENT-TYPE
等值的详细说明,请参见在Header中包含签名。
security-token
,格式如下:
http://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=nz2pc56s936**9l&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D&security-token=SecurityToken
错误码 | 返回消息 | 描述 |
---|---|---|
AccessDenied | 403 Forbidden | 在URL中添加签名时,Signature、Expires和OSSAccessKeyId顺序可以调换,但缺少Signature、Expires或OSSAccessKeyId中的一个或者多个。 |
AccessDenied | 403 Forbidden | 访问的当前时间晚于请求中设定的Expires时间或时间格式错误。 |
InvalidArgument | 400 Bad Request | URL中包含Signature、Expires、OSSAccessKeyId中的一个或者多个,并且Header中也包含签名消息。 |
联系客服