OSS上传回调支持自定义header以及v2版本签名

上传回调(callback)是OSS的一个重要功能,可以应用在客户端与服务器端数据同步等一些场景。上传回调功能支持在回调的body中传入信息,但是在一些场景下,用户希望能够在回调给应用服务器的请求header中传入自定义的header,用于满足服务器端的一些特殊需求。因此OSS在callback现有功能基础上支持了自定义header,并加强了签名算法,将header加入了签名中,支持v2版本签名,增强了安全性。

如果对上传回调功能不了解,请先阅读此文档https://help.aliyun.com/document_detail/31989.html?spm=5176.doc31853.2.5.2lI4WS

一、传入参数的变化

       callback功能是通过x-oss-callback这个header传入的参数来指定。这个header的value格式详细参考https://help.aliyun.com/document_detail/31989.html?spm=5176.doc31853.2.5.2lI4WS,在这个结构基础上,新增了两个字段,用于支持自定义header和v2版本签名。详细介绍如下:


字段


说明


示例


signatureVersion


可选,默认值是“1.0”。目前支持的值是“1.0”和“2.0”,“1.0”指默认的签名算法,“2.0”指本文描述的签名算法


"signatureVersion" :
"2.0"


additionalHeaders


可选,是一个map,表示OSS回调给用户的自定义header,除了“x-oss-”开头的header以及额外保留的header外,其余header都可以传递,最大支持10个自定义header,自定义header的key只允许数字横杠以及小写字母。保留的header如下:

Content-Type

Content-Length

Host

Authorization

User-Agent

Content-Md5

Expect

Upgrade

Keep-Alive


"additionalHeaders" : {

   
"my-header" : "abc",

   
"any-header" : "abc"

}

 

       下面是一个完整的例子:


{

   
"callbackUrl" : "www.test.com",

   
"callbackHost" : "www.test.com",

   
"callbackBodyType" : "application/x-www-form-urlencoded",

   
"callbackBody" : "just for test",

   
"signatureVersion" : "2.0",

   
"additionalHeaders" : {

       
"my-header" : "abc",

       
"any-header" : "def"

   
}

}

 

二、接收到的请求的变化

       如果指定了自定义header以及v2版本签名,应用服务器接收到的请求中以下header将会增加或者变动:


header


说明


示例


用户指定的自定义header


用户通过additionalHeaders字段指定的header都会体现在回调请求中


“my-header”:”abc”

“any-header”:”def”


x-oss-additional-headers


这个字段的内容是用户传入的自定义header的key列表,以逗号分隔


x-oss-additional-headers:any-header,my-header


x-oss-signature-version


默认是”1.0”,如果指定用v2版本签名,值会相应的变为”2.0”


x-oss-signature-version:2.0

 

       比如上例的callback请求,应用服务器将会收到以下POST请求:


POST / HTTP/1.1

Host: www.test.com

Connection: close

Content-Length: 13

any-header: def

Authorization: PN7y979+gYNtSdJzEhdYnz/GCSUFF1L/SY6a6kvdy326A2JDryBjZj4sbAq3JVjTydngi4CihGfrq0V7pzZJKQ==

Content-MD5: /ddPByElLVc6RX1St8jL+Q==

Content-Type:
application/x-www-form-urlencoded

Date: Tue, 31 Oct 2017 01:58:58 GMT

my-header: abc

User-Agent: aliyun-oss-callback

x-oss-additional-headers:
any-header,my-header

x-oss-bucket: guoping-file

x-oss-owner: 1517986058650554

x-oss-pub-key-url:
aHR0cHM6Ly9nb3NzcHVibGljLmFsaWNkbi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0=

x-oss-request-id:
59F7D8E12084A5D5E8F5EA92

x-oss-requester: 1517986058650554

x-oss-signature-version: 2.0

x-oss-tag: CALLBACK

 

just for test

 

三、v2版本签名算法

       v1版本的签名算法只是将uri和body加到了签名中,由于OSS本身会传递一些以x-oss-开头的header,而且用户可能会自定义一些header,都需要加入到签名中,因此oss支持了v2版本的签名。v2版本签名算法与v1版本唯一不同的地方是待签名字符串的组织方式不一样,其他比如使用RSA算法都保持一致。

       v2版本待签名字符串的组织方式如下:


StrToSign = “POST” + “\n”

        
+ Content-MD5 + “\n”

        
+ Content-Type + “\n”

        
+ Date + “\n”

        
+ headers

        
+ uri

        
+ queryString

注:

1、Content-Md5。即Content-MD5头的值,比如上例为” /ddPByElLVc6RX1St8jL+Q==”,这个header按照标准的协议生成,可以用于验证body是否被篡改,因此v2版本的签名将此header签进去,并不再将body签进去。

2、Content-Type。即Content-Type头的值,上例为” application/x-www-form-urlencoded”

3、Date。即Date头的值,上例为” Tue,
31 Oct 2017 01:58:58 GMT”。

4、headers。包括用户自定义的header以及x-oss-开头的header。包括两个部分:

1) 由自定义header以及x-oss-开头的header按照key的小写字典序排列的key
value对,按照ToLower(key) + “:” + value + “\n”的方式一一加入到待签名字符串中。

2) 自定义header的key按照字典序排列后用”;”连接,最后再加上”\n”后加入到待签名字符串中。

5、uri。即回调的uri,需要注意的是需要做url编码。

6、queryString。将请求参数按照字典序排列,然后按照UrlEncode(key) + “=” + UrlEncode(value)的方式组织成一个单元,每一个单元再用”&”连接后,加入到”?”后面组成一个新的字符串,需要注意的是,如果请求参数中的key有重复,需要将重复的key和value都添加到待签名字符串中。如果没有请求参数,则不需要加此项

       生成待签名字符串后,剩下的就与v1版本相同,即authorization = base64_encode(rsa_sign(private_key, StrToSign, md5)),生成的签名与v1版本一样放在authorization头中。

四、示例

       下面以一个简单的python版本的应用服务器,来演示自定义header以及v2版本签名的使用。

       运行附件的应用服务器示例代码,python2.7 callback_app_server.py,注意需要安装M2Crypto库。按照上例给出的x-oss-callback参数发起callback请求(将其中的callbackUrl改成你实际运行callback_app_server.py的地址和端口),即可回调成功。有任何问题,欢迎加入钉钉群(11799757)沟通交流。

时间: 2024-10-29 16:53:03

OSS上传回调支持自定义header以及v2版本签名的相关文章

Ali OSS服务端签名直传并设置上传回调

服务端签名直传并设置上传回调 背景 请参考 Web端直传实践 里的背景介绍. 当采用服务端签名后直传方案后,问题来了,用户上传数据后,很多场景下,应用服务器都要知道用户上传了哪些文件,文件名字,甚至如果是图片的话,图片的大小等.为此OSS开发了上传回调功能. 用户的请求逻辑 用户向应用服务器取到上传policy和回调设置. 应用服务器返回上传policy和回调. 用户直接向OSS发送文件上传请求. 等文件数据上传完,OSS给用户Response前,OSS会根据用户的回调设置,请求用户的服务器.

OSS移动开发实战2 (30分钟快速搭建移动应用上传回调服务)

30分钟快速搭建移动应用上传回调服务 背景 上一篇文章我们介绍了如何快速搭建移动应用 参考移动端开发场景流程图点击查看 上述图中Android/iOS移动应用的职责 会负责申请STS凭证,然后使用从应用服务器取的凭证上传 上述图中应用服务器的职责 负责给Android/iOS移动应用,生成STS凭证 上述图中OSS的职责 OSS负责处理移动应用的数据请求 问题 对于Android/iOS移动应来说,移动应用只需要执行操作1(申请STS凭证),就能调用多次5(使用该STS凭证上传数据到OSS).这

上传回调错误及排除

关于上传回调 OSS在文件上传完成的时,可以提供回调(Callback)给用户的回调服务器(Callback Server).在上传请求中携带相应的回调参数,即能实现上传回调.支持上传回调的 API 接口有:PutObject.PostObject.CompleteMultipartUpload. 更详细的介绍请参看 开发人员指南.API. 提示:回调服务器(Callback Server),有时也叫业务服务器. 应用场景 通知.上传回调的一种典型应用是,授权的第三方上传并回调.第三方上传文件时

html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

原文:html5 图片上传,支持图片预览.压缩.及进度显示,兼容IE6+及标准浏览器 以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上传组件添加了单独的图片上传UI,支持图片预览和缩放(通过调整图片的大小以实现图片压缩). 上传组件特点 轻量级,不依赖任何JS库,核心代码(Q.Uploader.js)仅约700行,min版本加起来不到12KB 纯

jsoup 文件上传不支持怎么办?

问题描述 jsoup 文件上传不支持怎么办? jsoup 文件上传不支持怎么办?post一个文件上传的url connect 报500

java-实现文件上传,可批量上传,支持拖拽上传

问题描述 实现文件上传,可批量上传,支持拖拽上传 5C 做一个web展示一下,文件上传,如果支持断点传续更好,希望上传的文件保存到数据库....要不就保存到指定目录 解决方案 http://www.ablanxue.com/prone_20698_1.html 解决方案二: 文件上传,支持批量上传

cordova的FileTransfer文件上传回调不执行

问题描述 cordova的FileTransfer文件上传回调不执行 上传2次总是回调前一次,第二次上传回调第一次的,第三次上传回调第二次的,

JS上传组件FileUpload自定义模板的使用方法_javascript技巧

FileUpload 是国外一个纯javascript 写的大文件上传组件,该组件支持分片上传,断点续传,多文件等功能. 下面就为大家分享FileUpload上传组件自定义模板(FineUploaderBasic)的使用方法: 以下是配置代码: 前端配置: <!--定义按钮--> <div id="basic_uploader_fine"><i class="icon-upload icon-white"></i>选择

Android WebView 上传文件支持全解析_Android

默认情况下情况下,使用Android的WebView是不能够支持上传文件的.而这个,也是在我们的前端工程师告知之后才了解的.因为Android的每个版本WebView的实现有差异,因此需要对不同版本去适配.花了一点时间,参考别人的代码,这个问题已经解决,这里把我踩过的坑分享出来. 主要思路是重写WebChromeClient,然后在WebViewActivity中接收选择到的文件Uri,传给页面去上传就可以了.创建一个WebViewActivity的内部类 public class XHSWeb