阿里云oss中Authorization字段的生成
背景
阿里云OSS是流行的文件存储服务。其已经提供了丰富的SDK供开发同学使用。
此外,OSS还提供了API接口,供SDK不能满足的情况下自定义开发使用。
问题
我恰巧遇到了一个需求,需要对几十万级别的OSS进行批量操作。
如果看过我前面几篇文章的话,就会清楚使用异步方式来调用,可以最小化的占用CPU资源,同时最大化的使用IO资源,达到最快的操作效率。
目前OSS SDK提供的都是同步操作,所以需要自己通过OSS API来生成HTTP请求,来进行异步操作。
体验
前面写的都不重要,本文只记录OSS API中 Authorization
签名字符如何生成。
签名方式
有两种,一种是在 header 中包含签名,另一种是在 url中包含签名。
header中包含签名
签名字段由 OSS, accessKeyId 和 signature 三部分组成,如下:
http.setHeader(OSSHeaders.AUTHORIZATION, "OSS " + accessKeyId + ":" + signature);
而signature可以使用OSS SDK中的Java方法来直接生成,如下:
String signature = ServiceSignature.create().computeSignature(accessKeySecret, canonicalString);
这里面的canonicalString
中一个拼起来的字符串。
这个字符串如何拼呢?
一种方式是:直接抓阿里云的请求包,来看OSS SDK的调用请求,方法如下:
% ngrep -Wbyline port 80
另一种方式是:在类OSSRequestSigner
中设置断点,来看通过SDK调用时,canonicalString
的值是什么。然后对应着自己来拼。
细节略。
url中包含签名
-
直接用Java SDK来生成,如
OSSClient.generatePresignedUrl
。 -
同时使用上面的方法。只有 canonicalString 中的 date 变成了 expires。
细节略。