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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 上传回调(callback)是OSS的一个重要功能,可以应用在客户端与服务器端数据同步等一些场景。上传回调功能支持在回调的body中传入信息,但是在一些场景下,用户希望能够在回调给应用服务器的请求header中传入自定义的header,用于满足服务器端的一些特殊需求。

上传回调(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)沟通交流。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
1月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
7月前
|
对象存储
阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
281 0
|
9天前
|
存储 安全 API
对象存储OSS产品常见问题之在URL中包含签名如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
33 0
|
4月前
|
DataWorks 算法 对象存储
这个问题可能是由于DataWorks和OSS之间的签名算法不一致导致的
这个问题可能是由于DataWorks和OSS之间的签名算法不一致导致的
23 2
|
4月前
|
存储 Kubernetes 对象存储
Kubernetes版本对接对象存储几种方案
Kubernetes版本对接对象存储几种方案
183 0
|
7月前
|
存储 域名解析 安全
Nest 实现OSS 服务端签名直传并设置上传回调
Nest 实现OSS 服务端签名直传并设置上传回调
354 0
|
7月前
|
存储 前端开发 JavaScript
Nestjs+Vue实现阿里云OSS服务端签名直传
阿里云 OSS 是常用的对象存储服务,借助其提供的 SDK,客户端(浏览器,小程序等)可以非常方便的将文件上传到 OSS 进行管理。
685 0
Nestjs+Vue实现阿里云OSS服务端签名直传
|
网络协议 Java Linux
OSS 上传出现异常
OSSBrower "no space left on" 分析: 有明显报错信息的先 Google 一下,看看是操作系统错误还是 OSSBrower 抛出,经过鉴定错误是 Linux 系统底层返回,说明当时系统的 OSSBrower 所在的目录磁盘满了,开源的错误到处可以看到,自行解决即可。
OSS 上传出现异常
|
网络协议 Linux 开发工具
OSS 上传出现异常
OSSBrower "no space left on" 分析: 有明显报错信息的先 Google 一下,看看是操作系统错误还是 OSSBrower 抛出,经过鉴定错误是 Linux 系统底层返回,说明当时系统的 OSSBrower 所在的目录磁盘满了,开源的错误到处可以看到,自行解决即可。
6817 0
|
1月前
|
Java API 开发工具
如何用阿里云 oss 下载文件
阿里云对象存储服务(OSS)提供了多种方式下载文件,以下讲解下各种方式的下载方法
897 1

相关产品

  • 对象存储