Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向Azure Blob存储[REST API][Azure Blob存储]发出GET请求时授权失败_Javascript_Node.js_Azure_Azure Storage Blobs_Azure Authentication - Fatal编程技术网

Javascript 向Azure Blob存储[REST API][Azure Blob存储]发出GET请求时授权失败

Javascript 向Azure Blob存储[REST API][Azure Blob存储]发出GET请求时授权失败,javascript,node.js,azure,azure-storage-blobs,azure-authentication,Javascript,Node.js,Azure,Azure Storage Blobs,Azure Authentication,我试图发出GET请求以获取我的Azure Blob存储帐户的帐户详细信息,但每次都显示Auth失败。 有人能告诉我们所形成的标题或签名字符串是否正确,或者是否存在其他问题吗 代码如下: const account = process.env.ACCOUNT_NAME || ""; const key = process.env.ACCOUNT_KEY || ""; var strTime = new Date().toUTCString(); var s

我试图发出GET请求以获取我的Azure Blob存储帐户的帐户详细信息,但每次都显示Auth失败。 有人能告诉我们所形成的标题或签名字符串是否正确,或者是否存在其他问题吗

代码如下:

const account = process.env.ACCOUNT_NAME || "";
const key = process.env.ACCOUNT_KEY || "";

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:2018-03-28\n/${account}/\ncomp:properties\nrestype:account`;
var secret = CryptoJS.enc.Base64.parse(key);
var hash = CryptoJS.HmacSHA256(strToSign, secret);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
var auth = `SharedKey ${account}:${hashInBase64}`;

const options = {
  url: `https://${account}.blob.core.windows.net/?comp=properties&restype=account`,

  headers: {
    Authorization: auth,
    "x-ms-date": strTime,
    "x-ms-version": "2018-03-28",
  },
};

function callback(error, response, body) {
  var json = parser.toJson(body);
  console.log(error);
  console.log(response);
  if (!error && response.statusCode == 200) {
    var json = parser.toJson(body);
    console.log(json);
  }
}

request(options, callback);
在此之后,我得到的response.statusCode是状态403

statusCode: 403,
statusMessage: 'Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.',
有关azure blob、标头和身份验证的详细信息可在此处找到:

编辑: 字符串param
=
已更正为

请求Azure Blob存储将更容易。如果要获取存储帐户信息,请尝试以下代码:

const { BlobServiceClient, StorageSharedKeyCredential } = require("@azure/storage-blob");

const account = '<storage account name>'
const accountKey = '<storage account key>'

const sharedKeyCredential = new StorageSharedKeyCredential(account, accountKey);

const blobServiceClient = new BlobServiceClient(
    `https://${account}.blob.core.windows.net`,
    sharedKeyCredential
);

blobServiceClient.getAccountInfo().then((result)=>{
    console.log("accountKind:"+result.accountKind + " skuName:" + result.skuName + " version:" + result.version );
})
var CryptoJS = require("crypto-js");
var request = require("request");
var parser = require('body-parser')

const account = ''
const key = ''

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:2018-03-28\n/${account}/\ncomp:properties\nrestype:account`;

  //console.log(strToSign);
var secret = CryptoJS.enc.Base64.parse(key);
var hash = CryptoJS.HmacSHA256(strToSign, secret);
var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
var auth = `SharedKey ${account}:${hashInBase64}`;

const options = {
  url: `https://${account}.blob.core.windows.net/?comp=properties&restype=account`,

  headers: {
    Authorization: auth,
    "x-ms-date": strTime,
    "x-ms-version": "2018-03-28",
  },
};

function callback(error, response, body) {
 
  console.log(body);
  if (!error && response.statusCode == 200) {
    
    console.log(response.headers["x-ms-sku-name"]);
  }
}

request(options, callback);
结果:


似乎您应该使用
而不是
=
在您的
strotSign

的最后一个参数中使用
是的,我已经使用Azure Storage SDK尝试过它,它可以工作,但我想以更通用的方式尝试它。因此不能使用Azure SDK。谢谢。@MayankPatel,我已经更新了我的答案,如果它对您有帮助,请您单击答案旁边的复选标记,将其从灰色切换到填充,以接受它作为答案。谢谢,@Stanley,获取帐户信息的问题似乎已解决。但我遇到了另一个问题,获取容器详细信息。我正在使用的资源字符串是:var strosign=“GET\n\n\n\n\n\n\n\n\n\n\nx ms date:“+strTime+
\nx ms version:2018-03-28\n/${account}/demo?restype:container
;url是:
https://${account}.blob.core.windows.net/demo?restype=container
我缺少什么重要的东西。@MayankPatel,你能打开一个新问题并让我知道它的链接吗?嗨,这个问题现在已经解决了,我遇到了另一个问题,这个问题与使用RESTAPI将数据作为流上传到azure blob有关。这是问题的链接,请看一下。