361
阿里云
在URL中包含签名__访问控制_API 参考_对象存储 OSS-阿里云
除了使用Authorization Head,用户还可以在URL中加入签名信息,这样用户就可以把该URL转给第三方实现授权访问。
实现方式
URL签名示例:
https://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?AccessKeyId=AccessKeyId&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D
URL签名,必须至少包含Signature,Expires,AccessKeyId三个参数。
Expires
这个参数的值是一个UNIX时间(自UTC时间1970年1月1号开始的秒数,详见wiki),用于标识该URL的超时时间。如果OSS接收到这个URL请求的时候晚于签名中包含的Expires参数时,则返回请求超时的错误码。例如:当前时间是1141889060,开发者希望创建一个60秒后自动失效的URL,则可以设置Expires时间为1141889120。AccessKeyId
即密钥中的AccessKeyId。Signature
表示签名信息。所有的OSS支持的请求和各种Header参数,在URL中进行签名的算法和在Header中包含签名的算法基本一样。Signature = urlencode(base64(hmac-sha1(AccessKeySecret,
VERB + "n"
+ CONTENT-MD5 + "n"
+ CONTENT-TYPE + "n"
+ EXPIRES + "n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource)))
其中,与header中包含签名相比主要区别如下:
- 通过URL包含签名时,之前的Date参数换成Expires参数。
- 不支持同时在URL和Head中包含签名。
- 如果传入的Signature,Expires,OSSAccessKeyId出现不止一次,以第一次为准。
- 请求先验证请求时间是否晚于Expires时间,然后再验证签名。
- 将签名字符串放到url时,注意要对url进行urlencode
- 时临时用户URL签名时,需要携带
security-token
,格式如下:https://oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?AccessKeyId=AccessKeyId&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D&security-token=SecurityToken
示例代码
URL中添加签名的python示例代码:
import base64
import hmac
import sha
import urllib
h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV",
"GETnnn1141889120n/oss-example/oss-api.pdf",
sha)
urllib.quote (base64.encodestring(h.digest()).strip())
提示:
- 上面为python的示例代码
- 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
细节分析
- 使用在URL中签名的方式,会将你授权的数据在过期时间以内曝露在互联网上,请预先评估使用风险。
- PUT和GET请求都支持在URL中签名。
- 在URL中添加签名时,Signature,Expires,AccessKeyId顺序可以交换,但是如果Signature,Expires,AccessKeyId缺少其中的一个或者多个,返回403 Forbidden。错误码:AccessDenied。
- 如果访问的当前时间晚于请求中设定的Expires时间,返回403 Forbidden。错误码:AccessDenied。
- 如果Expires时间格式错误,返回403 Forbidden。错误码:AccessDenied。
- 如果URL中包含参数Signature,Expires,AccessKeyId中的一个或者多个,并且Head中也包含签名消息,返回消息400 Bad Request。错误码:InvalidArgument。
- 生成签名字符串时,除Date被替换成Expires参数外,仍然包含content-type、content-md5等上节中定义的Header。(请求中虽然仍然有Date这个请求头,但不需要将Date加入签名字符串中)
最后更新:2016-12-12 15:02:18
上一篇:
在Header中包含签名__访问控制_API 参考_对象存储 OSS-阿里云
下一篇:
临时授权访问__访问控制_API 参考_对象存储 OSS-阿里云
JAVA-SDK__点播SDK_SDK手册_视频点播-阿里云
AccessKey__数据类型_RAM API文档_访问控制-阿里云
退款__购买指导_证书服务-阿里云
项目(Project)__基础概念_用户指南_日志服务-阿里云
错误响应__图片处理指南_对象存储 OSS-阿里云
鉴权Action__OpenAPI RAM鉴权_OpenAPI 2.0_移动推送-阿里云
域名注册流程__域名注册_注册续费_域名-阿里云
4.4 多计算引擎和Hint__第四章 DML_使用手册_分析型数据库-阿里云
示例一__快速开始_Quick BI-阿里云
查询回源流量__资源监控接口_API 手册_CDN-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云