我一直在关注blob服务和身份验证文档,以便通过移动服务在我的azure blob存储帐户上设置CORS属性。
我不知道我在做什么错。
服务器响应为:
在HTTP请求“ JI ... Tk =”中找到的MAC签名与任何计算出的签名都不相同。服务器使用以下字符串进行签名:'PUT
x-ms-date:Wed,19 Feb 2014 07:24:06 GMT x-ms-version:2013-08-15 / apporotest /?comp = properties'
当我在一端登录要签名的字符串(不传递contentMD5和内容类型)时,结果却是相同的字符串。所以我想我建立共享密钥的功能是错误的。
这应该建立:Base64(HMAC-SHA256(UTF8(StringToSign))):
function buildSharedKeyLite( verb, contentMD5, contentType, canonicalizedHeaders, canonicalizedResource ) {
var stringToSign = verb + "\n" +
contentMD5 + "\n" +
contentType + "\n" +
"" + "\n" + // date is to be empty because we use x-ms-date
canonicalizedHeaders +
canonicalizedResource;
return crypto.createHmac('sha256', self.accountKey).update(encodeURIComponent(stringToSign)).digest('base64');
}
但是,令我困惑的是,之前提到的Shared Key Lite文档要求内容的MD5以及要设置的内容类型。但是,带有字符串签名的服务器响应似乎并不期望这些。
如果共享密钥精简版的创建正确,那么我认为我没有正确处理MD-5内容或规范化标头的创建:
function setCors( cors ) {
var url = MY_ACCOUNT_UTL + '/?restype=service&comp=properties';
var canonicalizedResource = '/' + MY_ACCOUNT_NAME + '/?comp=properties';
var corsMD5 = crypto.createHash('md5' ).update(MY_CORS_XML).digest('base64');
var date = (new Date()).toUTCString();
var headers = {
'x-ms-version': '2013-08-15',
'x-ms-date': date,
'Host': MY_ACCOUNT_HOST
};
var canonicalizedHeaders = buildCanonicalizedHeaders( headers );
// THIS
var key = buildSharedKeyLite( 'PUT', corsMD5, 'text/plain; charset=UTF-8', canonicalizedHeaders, canonicalizedResource );
// AND THIS, BOTH YIELD THE SAME SERVER RESPONSE
var key = buildSharedKeyLite( 'PUT', "", "", canonicalizedHeaders, canonicalizedResource );
headers['Authorization'] = 'SharedKeyLite ' + MY_ACCOUNT_NAME + ':' + key;
var options = {
url: url,
headers: headers
};
function onPropertiesSet(error, response, body) {
if (!error && response.statusCode == 202) {
console.log("CORS: OK");
}
else {
console.log("CORS: "+ response.statusCode);
console.log(body);
}
}
request.put(options, onPropertiesSet); // require('request')
}
function buildCanonicalizedHeaders( headers ) {
var xmsHeaders = [];
var canHeaders = "";
for ( var name in headers ) {
if ( name.indexOf('x-ms-') == 0 ) )
xmsHeaders.push( name );
}
}
xmsHeaders.sort();
for ( var i = 0; i < xmsHeaders.length; i++ ) {
name = xmsHeaders[i];
canHeaders = canHeaders + name.toLowerCase().trim() + ':' + headers[name] + '\n';
}
return canHeaders;
}
我真的很感谢任何指示。
我不确定100%,但我相信encodeURIComponent
这会给您带来麻烦。例如,看下面的代码:
var a = "PUT\n\n\nFeb 2014 09:08:18 GMT\nx-ms-version:2013-08-15\n/cynapta/?comp=properties";
var b = encodeURIComponent(a);
console.log(a);
console.log("\n");
console.log(b);
这是在控制台上显示的方式a
和b
方式:
您可以尝试删除encodeURIComponent
并直接通过stringToSign
签名计算吗?
更新
查看here
用于签署请求的源代码,并假设您将存储帐户密钥作为字符串传递,可以在buildSharedKeyLite
函数中尝试以下操作:
return crypto.createHmac('sha256', new Buffer(self.accountKey, 'base64')).update(stringToSign).digest('base64');
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句