gpt4 book ai didi

node.js - 如何使用 Node 设置 Azure Blob 存储 CORS 属性?

转载 作者:太空宇宙 更新时间:2023-11-04 01:07:14 24 4
gpt4 key购买 nike

我一直关注blob serviceauthentication documentation为了通过我的移动服务在我的 azure blob 存储帐户上设置 CORS 属性。

我不知道我做错了什么。

服务器响应是:

The MAC signature found in the HTTP request 'JI...Tk=' is not the same as any computed signature. Server used following string to sign: 'PUT

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

当我在我这边记录要签名的字符串(不传递 contentMD5 和内容类型)时,结果发现它是相同的字符串。所以我猜我构建共享 key 的函数是错误的。

这应该构建: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 以及要设置的内容类型。但是,带有要签名的字符串的服务器响应似乎并不期望这些。

如果共享 key 精简版的创建正确,那么我认为我没有正确处理 MD-5 内容或规范化 header 的创建:

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

这就是 ab 在我的控制台上的显示方式:

enter image description here

您可以尝试删除 encodeURIComponent 并直接传递 stringToSign 进行签名计算吗?

更新

看源码here为了签署请求并假设您将存储帐户 key 作为字符串传递,您可以在 buildSharedKeyLite 函数中尝试以下操作:

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

关于node.js - 如何使用 Node 设置 Azure Blob 存储 CORS 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21874694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com