我需要帮助为Azure存储REST创建共享密钥签名。
在chrome中,我可以输出我正在签名的字符串:
PUT
11
text/plain;charset=UTF-8
x-ms-blob-type:BlockBlob
x-ms-date:Wed, 09 Dec 2015 11:53:00 GMT
x-ms-version:2015-04-05
/myaccount/logs
使用Postman,服务器返回了以下内容:
<?xml version="1.0" encoding="utf-8"?>
<Error>
<Code>AuthenticationFailed</Code>
<Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:6ca14d01-0001-00cb-5673-32e680000000
Time:2015-12-09T11:20:01.6093647Z</Message>
<AuthenticationErrorDetail>The MAC signature found in the HTTP request 'O1Xwmg6TeU53qYoDiKQHgJZc+58uPaJPvotxXL116XQ=' is not the same as any computed signature. Server used following string to sign: 'PUT
11
text/plain;charset=UTF-8
x-ms-blob-type:BlockBlob
x-ms-date:Wed, 09 Dec 2015 11:53:00 GMT
x-ms-version:2015-04-05
/myaccount/logs'.</AuthenticationErrorDetail>
</Error>
正如您所看到的,两个签名字符串都是相同的。我检查过,两篇文章没有区别。
这是我执行生成签名的代码:
var accessKeyBytes = CryptoJS.enc.Base64.parse(base64EncodedSharedKey);
var encodedBits = CryptoJS.HmacSHA256(stringToSign, accessKeyBytes);
var result = CryptoJS.enc.Base64.stringify(encodedBits);
return result;
其中base64EncodedSharedKey是Azure存储的主键。
你有什么想法吗?我能做错什么?在形成要签名的JavaScript字符串时,我应该反斜杠吗?
答案 0 :(得分:1)
解决。
问题是,在要签名的字符串的末尾,我放了一个\ n。
我不应该把回车放在字符串的末尾。