阿里云oss中Authorization字段的生成

  |   0 评论   |   0 浏览

背景

阿里云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中包含签名

  1. 直接用Java SDK来生成,如 OSSClient.generatePresignedUrl

  2. 同时使用上面的方法。只有 canonicalString 中的 date 变成了 expires。

细节略。

参考