图像搜索服务会对每个访问的请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求头中包含签名(Authorization)信息。图像搜索通过使用Access Key ID和Access Key Secret进行对称加密的方法来验证请求的发送者身份。Access Key ID和Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中Access Key ID用于标识访问者的身份;Access Key Secret是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。 签名操作
签名主要包含以下几部分内容:公共请求头(http协议header参数、阿里云协议header参数)、CanonicalizedResource(规范资源)、Body。
首先计算body的MD5值,然后再对其进行base64编码,编码后的值设置到 Header中。
使用请求中的Header参数构造规范化的Header字符串。
headerStringToSign =
HTTP-Verb + "\n" + //HTTP_Verb为POST或者GET
Accept + “\n” + //Accept为application/json
Content-MD5 + "\n" + //第1步中计算出来的MD5值
Content-Type + "\n" + //Content-Type值为application/octet-stream;chrset=utf-8
Date + "\n" + //Date值为GMT时间
“x-acs-signature-method:HMAC-SHA1\n” +
“x-acs-signature-nonce:” + ${x-acs-signature-nonce} + "\n" +
“x-acs-version:2018-01-20" + "\n";
CanonicalizedResource 表示客户想要访问资源的规范描述,需要将子资源和qurey一同按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串(?后的所有参数),示例如下。
resourceStringToSign =
URI + "?instanceName=" + ${instanceName};
将上两步构造的规范化字符串按照下面的规则构造成待签名的字符串。
stringToSign = headerStringToSign + resourceStringToSign;
按照 RFC2104的定义,计算待签名字符串StringToSign的 HMAC 值,按照 Base64 编码规则把上面的 HMAC 值编码成字符串,并在前面加上AccessKeyId,即得到签名值(Authorization),示例如下:
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
Authorization = "acs " + AccessKeyId + ":" + Signature
注意:计算签名时使用的 Key 就是您持有的Access Key Secret,使用的哈希算法是 SHA1。
示例
假定用户请求如下:
curl -X POST
-H "date:Sat 27 Jan 2018 17:53:28 GMT"
-H "content-md5:MACiECZtnLiNkNS1v5ZCAA=1"
-H "content-type:application/x-www-form-urlencoded;charset=utf-8"
-H "x-acs-signature-method:HMAC-SHA1"
-H "x-acs-signature-nonce:123212345678231234"
-H "x-acs-version:2019-03-25"
-H "accept:application/json"
-d "..."
"http://imagesearch.cn-shanghai.aliyuncs.com/v2/image/search"
计算得到的stringToSign为:
POST
application/json
MACiECZtnLiNkNS1v5ZCAA==
application/x-www-form-urlencoded;charset=utf-8
Sat 27 Jan 2018 19:54:26 GMT
x-acs-signature-method:HMAC-SHA1
x-acs-signature-nonce:123212345678231235
x-acs-version:2019-03-25
/v2/image/search
假定 accessKeyId 为 testAccessKey,accessSecrect 为 testKeySecrect,计算得到的签名值为:
acs testAccessKey:31nTIpResD/0C8gb+ChUeuvsxlw=
最后将得到的签名值加入到 Header 的 Authorization 当中。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。