Ошибка авторизации при отправке запроса GET в хранилище BLOB-объектов Azure [REST API] [Хранилище BLOB-объектов Azure]

Я пытаюсь сделать запрос GET, чтобы получить сведения об учетной записи моей учетной записи хранилища BLOB-объектов Azure, но каждый раз он показывает, что проверка подлинности завершилась неудачно. Может ли кто-нибудь сказать, правильно ли сформирован заголовок или строка подписи или есть какие-то другие проблемы?

Вот код:

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 - Status 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, заголовках и Auth можно найти здесь: https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key

https://docs.microsoft.com/en-us/rest/api/storageservices/get-account-information

РЕДАКТИРОВАТЬ: Параметр строки = был исправлен на :


person Mayank Patel    schedule 02.03.2021    source источник


Ответы (1)


Будет намного проще с помощью пакета SDK для хранилища Azure JS. для отправки запросов в хранилище BLOB-объектов Azure. Если вы хотите получить информацию о своей учетной записи хранения, просто попробуйте код ниже:

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

Результат:

введите описание изображения здесь

Кажется, вам следует использовать : вместо = в последнем параметре вашего strToSign.

person Stanley Gong    schedule 02.03.2021
comment
Да, я пробовал использовать его с помощью пакета SDK хранилища Azure, и он работает, но я хочу попробовать его в более общем виде. Таким образом, нельзя использовать Azure SDK. Спасибо. - person Mayank Patel; 02.03.2021
comment
@MayankPatel, я обновил свой ответ, если он вам полезен, не могли бы вы нажать на галочку рядом с ответом, чтобы переключить его с серого на заполненный, чтобы принять его в качестве ответа? - person Stanley Gong; 02.03.2021
comment
Спасибо, @Stanley кажется, что проблема с получением информации об учетной записи была решена. Но я столкнулся с другой проблемой, касающейся получения сведений о контейнере. Строка ресурса, которую я использую: 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}/demo?restype:container; а URL: https://${account}.blob.core.windows.net/demo?restype=container есть ли что-то важное, чего мне не хватает. - person Mayank Patel; 02.03.2021
comment
@MayankPatel, не могли бы вы открыть новый вопрос и дать мне ссылку на него? - person Stanley Gong; 04.03.2021
comment
Привет, эта проблема была решена, в настоящее время я застрял на другой проблеме, связанной с загрузкой данных в виде потока в Azure blob с использованием REST API. Вот ссылка на проблему, пожалуйста, посмотрите. Ссылка - person Mayank Patel; 04.03.2021