如何使用节点设置Azure Blob存储CORS属性?

我一直在遵循blob服务和身份validation文档 ,以便从我的移动服务设置我azure blob存储帐户上的CORS属性。

我无法弄清楚我做错了什么。

服务器响应是:

在HTTP请求'JI … Tk ='中find的MAC签名与任何计算签名都不相同。 服务器用下面的string来签名:'PUT

x-ms-date:Wed,19 Feb 2014 07:24:06 GMT x-ms-version:2013-08-15 / apporotest /?comp = properties'

当我loginstring签名(不传递contentMD5和内容types)在我的结尾,它变成了相同的string。 所以我想我的function来build立共享密钥是错误的。

这应该build立: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以及要设置的内容types。 然而,服务器响应与string签名似乎并不期望这些。

如果共享密钥lite的创build是正确的,那么我假设我没有正确处理MD-5内容的创build或标准化的头文件:

 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正在为您创build问题。 例如,看下面的代码:

 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); 

这是如何在我的控制台上显示ab

在这里输入图像说明

你可以尝试通过删除encodeURIComponent ,只是直接传递stringToSign进行签名计算?

更新

here查看源代码签署请求,并假设您将存储帐户密钥作为string传递,可以在buildSharedKeyLite函数中尝试以下buildSharedKeyLite

 return crypto.createHmac('sha256', new Buffer(self.accountKey, 'base64')).update(stringToSign).digest('base64');