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

本文涉及的产品
对象存储 OSS,20GB 3个月
文件存储 NAS,50GB 3个月
日志服务 SLS,月写入数据量 50GB 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,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
6月前
|
存储 网络协议 网络安全
oss自定义域名绑定(Custom Domain Binding)
阿里云OSS支持自定义域名绑定,让用户可通过自有域名访问存储文件。步骤包括:1) 确保域名已备案并在阿里云验证;2) 在OSS控制台选择Bucket,绑定自定义域名并验证备案号;3)(可选)配置SSL证书;4) 在DNS服务商处设置CNAME记录;5)(可选)启用CDN加速。此功能有助于提升品牌识别度、安全性和文件预览体验。
1396 1
|
6月前
|
监控 Serverless 测试技术
Serverless 应用引擎常见问题之生成的图片的oss地址配成自定义的域名如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
|
6月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
1054 1
|
对象存储
阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
490 0
|
1月前
|
存储 Java 开发工具
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
阿里云OSS(Object Storage Service)是一种安全、可靠且成本低廉的云存储服务,支持海量数据存储。用户可通过网络轻松存储和访问各类文件,如文本、图片、音频和视频等。使用OSS后,项目中的文件上传业务无需在服务器本地磁盘存储文件,而是直接上传至OSS,由其管理和保障数据安全。此外,介绍了OSS服务的开通流程、Bucket创建、AccessKey配置及环境变量设置,并提供了Java SDK示例代码,帮助用户快速上手。最后,展示了如何通过自定义starter简化工具类集成,实现便捷的文件上传功能。
【三方服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里云OSS服务starter)
|
6月前
|
存储 搜索推荐 对象存储
OSS绑定自定义域名至Bucket默认域名
OSS绑定自定义域名至Bucket默认域名
153 1
|
4月前
|
域名解析 Serverless API
函数计算产品使用问题之如何配置自定义域名访问OSS中的内容
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
域名解析 对象存储
OSS绑定自定义域名(基于阿里云)
OSS绑定自定义域名(基于阿里云)
561 0
|
6月前
|
存储 安全 API
对象存储OSS产品常见问题之在URL中包含签名如何解决
对象存储OSS是基于互联网的数据存储服务模式,让用户可以安全、可靠地存储大量非结构化数据,如图片、音频、视频、文档等任意类型文件,并通过简单的基于HTTP/HTTPS协议的RESTful API接口进行访问和管理。本帖梳理了用户在实际使用中可能遇到的各种常见问题,涵盖了基础操作、性能优化、安全设置、费用管理、数据备份与恢复、跨区域同步、API接口调用等多个方面。
273 0
|
6月前
|
DataWorks 算法 对象存储
这个问题可能是由于DataWorks和OSS之间的签名算法不一致导致的
这个问题可能是由于DataWorks和OSS之间的签名算法不一致导致的
41 2

相关产品

  • 对象存储