Azure: таблица acl GET с использованием Azure REST API не работает, если сделано в соответствии с документацией - PullRequest
0 голосов
/ 17 мая 2018

Я следую документации REST Azure для GET ACL Table , Аутентификация для Azure Storage Services .

Ниже приведен фрагмент кода для операции REST, которую я выполняю.

//Input your Storage Account and access-key associated to it.
const yourStorageAccountName = '';
const accessKeyStorageAccount = '';
const Client = require('node-rest-client').Client;
const crypto = require("crypto");

async function getTableAcl() {
    let now = new Date();
    let nowUTC = now.toUTCString();
    let contentType = "application/json"
    // construct input value
    let stringToSign = `GET\n\n\n${nowUTC}\n/${yourStorageAccountName}/tablename\ncomp:acl`;
    let accesskey = accessKeyStorageAccount;
    // create base64 encoded signature
    let key = new Buffer(accesskey, "base64");
    let hmac = crypto.createHmac("sha256", key);
    hmac.update(stringToSign);
    let sig = hmac.digest("base64");
    console.log("SIGNATURE : " + sig);
    console.log("nowutc : " + nowUTC);
    let args = {
        headers: {
            "Authorization": "SharedKey " + yourStorageAccountName + ":" + sig,
            "Date": nowUTC,
            "x-ms-version": "2015-12-11"
        }
    };
    let restClient = new Client();
    restClient.get(`https://${yourStorageAccountName}.table.core.windows.net/tablename?comp=acl`, args, function (data, response) {
        console.log(JSON.stringify(data));
        //console.log(response);
    });
}

getTableAcl()

Подвох в том, что в документации Azure Table нет упоминания Content-Type, но в части заголовка Authorization указывается включение Content-Type. Следовательно, я сохраняю тип содержимого пустым в "stringToSign" и не предоставляю заголовок Content-Type в вызове REST. Возможно, я что-то упускаю, но не могу определить, что это может быть.

Можете ли вы сообщить мне, если я что-то не так в этом случае?

1 Ответ

0 голосов
/ 17 мая 2018

По сути, проблема в том, что вы правильно генерируете канонизированную строку ресурса.

Документация гласит следующее:

2009-09-19 и более поздних версий Shared Key Lite и сервисный формат Table

Этот формат поддерживает Shared Key и Shared Key Lite для всех версий службы Table и Shared Key Lite для версии 2009-09-19 и позже сервисов Blob и Queue и версии 2014-02-14 и позже Файловый сервис. Этот формат идентичен тому, который используется с предыдущие версии сервисов хранения. Построить Строка CanonicalizedResource в этом формате выглядит следующим образом:

  1. Начиная с пустой строки (""), добавьте косую черту (/), за которой следует имя учетной записи, которой принадлежит ресурс доступ.
  2. Добавить кодированный путь ресурса URI. Если URI запроса обращается к компоненту ресурса, добавьте соответствующий запрос строка. Строка запроса должна включать знак вопроса и комп параметр (например,? comp = метаданные). Других параметров не должно быть включено в строку запроса.

Исходя из этого, ваш stringToSign должен быть:

let stringToSign = `GET\n\n\n${nowUTC}\n/${yourStorageAccountName}/tablename?comp=acl`;

Попробуйте, оно должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...