gpt4 book ai didi

javascript - Azure存储服务REST API的授权

转载 作者:行者123 更新时间:2023-11-28 15:06:06 25 4
gpt4 key购买 nike

我一整天都在第一次调用 Azure 存储 REST API 时陷入困境。 Postman 的回复显示这是由于 Azure 身份验证错误,但我不知道问题出在哪里。

以下是发送 Azure 存储 REST API 的浏览器脚本:

function azureListContainers() {

var key = "key-copied-from-azure-storage-account";
var strTime = (new Date()).toUTCString();
var strToSign = 'GET\n\n\n\nx-ms-date:' + strTime + '\nx-ms-version:2015-12-11\n/myaccount/?comp=list';

var hash = CryptoJS.HmacSHA256(strToSign, key);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
var auth = "SharedKeyLite myaccount:"+hashInBase64;

console.log(strToSign);
console.log(auth);
console.log(strTime);

$.ajax({
type: "GET",
beforeSend: function (request)
{
request.setRequestHeader("Authorization", auth);
request.setRequestHeader("x-ms-date", strTime);
request.setRequestHeader("x-ms-version", "2015-12-11");
},
url: "https://myaccount.blob.core.windows.net/?comp=list",
processData: false,
success: function(msg) {
console.log(msg);
}
});
}

Chrome 开发者工具刚刚返回 No 'Access-Control-Allow-Origin' header,没有进一步的原因,所以我复制了 var authvar strTime 的内容,创建使用 Postman 工具发出相同的请求:

[Command]
GET https://myaccount.blob.core.windows.net/?comp=list


[Headers]
Authorization:SharedKeyLite myaccount:Z9/kY/D+osJHHz3is+8yJRqhj09VUlr5n+PlePUa8Lk=
x-ms-date:Tue, 09 Aug 2016 10:30:49 GMT
x-ms-version:2015-12-11


[Response Body]
<?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:9be3d595-0001-0012-4929-f2fde2000000
Time:2016-08-09T10:31:52.6542965Z</Message>
<AuthenticationErrorDetail>The MAC signature found in the HTTP request 'Z9/kY/D+osJHHz3is+8yJRqhj09VUlr5n+PlePUa8Lk=' is not the same as any computed signature. Server used following string to sign: 'GET



x-ms-date:Tue, 09 Aug 2016 10:30:49 GMT
x-ms-version:2015-12-11
/myaccount/?comp=list'.</AuthenticationErrorDetail>
</Error>

比较两个字符串后,我相信脚本中的 var strToSign 与 Azure 用于签名的字符串相同。但仍然出现身份验证错误。请帮忙指出问题所在。

最佳答案

Chrome Developer Tool just returned No 'Access-Control-Allow-Origin' header

当您使用 JavaScript 直接从客户端向 Azure 存储服务器发送 http 请求时。这是常见的CORS问题。

当您遇到此问题时,您可以enable the CORS for your storage services 。简单来说,您可以利用Microsoft Azure Storage Explorer配置您的存储。

enter image description here

AuthenticationFailed

我根据您的代码片段在我的测试项目中进行了两项修改以使其正常工作。

  1. var hash = CryptoJS.HmacSHA256(strToSign, key); 第二个参数,应该是账户 key 的base64解码,引用Azure Storage SDK for node.js
  2. 在我的测试中,我必须使用 SharedKey 方案并使用 SharedKey token 进行身份验证,才能使您的方案发挥作用。

这是我的测试代码片段,仅供引用。

var key = "key-copied-from-azure-storage-account";
var strTime = (new Date()).toUTCString();
var strToSign = 'GET\n\n\n\n\n\n\n\n\n\n\n\nx-ms-date:' + strTime + '\nx-ms-version:2015-12-11\n/<accountname>/\ncomp:list';
var secret = CryptoJS.enc.Base64.parse(key);
var hash = CryptoJS.HmacSHA256(strToSign, secret);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
var auth = "SharedKey <accountname>:"+hashInBase64;

此外,出于安全原因,请在后端 Web 服务器中实现 Azure 存储服务。由于在客户端使用纯javascript,会将您的账户名和账户 key 暴露给公众,这会增加您的数据和信息的风险。

关于javascript - Azure存储服务REST API的授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38849384/

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