Не удалось аутентифицировать учетную запись уровня SAS в Azure - PullRequest
0 голосов
/ 02 февраля 2019

Я следил за последней записью от Microsoft , пытаясь сгенерировать подпись общего доступа (SAS) на уровне учетной записи для использования со службами хранения Azure, в частности, BLOB-объектами.

Каждый разЯ выполняю PUT запрос к моей службе Blob, я получаю 403 ответ с сообщением:

Серверу не удалось аутентифицировать запрос.Убедитесь, что значение заголовка авторизации сформировано правильно, включая сигнатуру.

Это моя функция для генерации подписей:

use MicrosoftAzure\Storage\Common\Internal\StorageServiceSettings;
use MicrosoftAzure\Storage\Blob\BlobRestProxy;

public function generateUploadLink($container, $folder, $filename)
{
    # get account settings
    $settings = StorageServiceSettings::createFromConnectionString(AZURE_BLOB);
    $accountName = $settings->getName();
    $accountKey = $settings->getKey();

    # define start and expire datetime stamps (ISO 8601)
    $startTime = (new DateTime('GMT'))->modify('-2 days')->format('Y-m-d\TH:i:s\Z');
    $expireTime = (new DateTime('GMT'))->modify('+2 days')->format('Y-m-d\TH:i:s\Z');

    $parameters = [];
    $parameters[] = $accountName;       # account name
    $parameters[] = 'wac';              # permissions
    $parameters[] = 'b';                # service
    $parameters[] = 'sco';              # resource type
    $parameters[] = $startTime;         # start time
    $parameters[] = $expireTime;        # expire time
    $parameters[] = '';                 # accepted ip's
    $parameters[] = 'https,http';       # accepted protocol
    $parameters[] = '2018-03-28';       # latest microsoft api version

    # implode the parameters into a string
    $stringToSign = utf8_encode(implode("\n", $parameters));

    # decode the account key from base64
    $decodedAccountKey = base64_decode($accountKey);

    # create the signature with hmac sha256
    $signature = hash_hmac("sha256", $stringToSign, $decodedAccountKey, true);

    # encode the signature as base64
    $sig = urlencode(base64_encode($signature));

    # construct the sas (shared access signature)
    $sas = "sv=2018-03-28&ss=b&srt=sco&sp=wac&se={$expireTime}&st={$startTime}&spr=https,http&sig={$sig}";

    # create client
    $blobClient = BlobRestProxy::createBlobService(AZURE_BLOB);

    # generate upload link
    $blobUrlWithSAS = sprintf('%s%s?%s', (string)$blobClient->getPsrPrimaryUri(), "{$container}/{$folder}/{$filename}", $sas);

    # return upload link
    return $blobUrlWithSAS;
}

Пример моего вывода выглядит следующим образом:- при отправке запроса PUT на этот URL он завершается с вышеуказанным сообщением об ошибке.

https://batman.blob.core.windows.net/payroll-enroll/2019/test.txt?sv=2018-03-28&ss=b&srt=sco&sp=wac&se=2019-02-04T03:44:51Z&st=2019-01-31T03:44:51Z&spr=https,http&sig=ox7RdKGTKRYvGz2u9ScFv4TP4ZfduKxFhYdpvJKjE4A%3D

Для сравнения, если я сгенерирую подпись общего доступа на уровне учетной записи непосредственно изПортал Azure выглядит следующим образом: при выполнении запроса PUT на этот URL-адрес он выполняется успешно.

https://batman.blob.core.windows.net/payroll-enroll/2019/test.txt?sv=2018-03-28&ss=b&srt=sco&sp=wac&se=2019-02-02T16:29:17Z&st=2019-02-02T08:29:17Z&spr=https,http&sig=omPc4ZwEdefDoHKqA4TqVOm3NUW%2BcKcNqTuD1hq94VU%3D

Я не вижу различий между ними, кроме начала иистекают времена.Кроме того, я также отмечу, что я попытался сгенерировать SAS уровня обслуживания с использованием пакета azure-storage-php с тем же результатом ( не удалось аутентифицировать запрос ).

Я подтвердил и / или попытался выполнить следующие действия:

  • $accountName и $accountKey возвращают правильные значения по сравнению с тем, что видно через портал Azure
  • пробовал каждый из now, UTC и GMT в качестве параметров для DateTime()
  • при условии достаточного заполнения (2 дня) с обеих сторон, просто чтобы убедиться, что это не проблема разницы во временикак часто отмечалось в других проблемах, которые я прочитал в настройках стека
  • примененных подстановочных знаков (*) CORS для моей учетной записи хранения для ALLOWED METHODS, ALLOWED ORIGINS, ALLOWED HEADERS и EXPOSED HEADERS
  • отключено Secure transfer required (разрешить как http, так и https)

Я в тупике.

Мой вопрос :Что я делаю не так при создании SAS и почему я продолжаю получать ошибки запросов, связанные с аутентификациейТион?

1 Ответ

0 голосов
/ 02 февраля 2019

Пожалуйста, измените следующую строку кода:

$stringToSign = utf8_encode(implode("\n", $parameters));

на

$stringToSign = utf8_encode(implode("\n", $parameters) . "\n");

По сути, вам необходимо добавить дополнительный символ новой строки.

Взят изкод здесь: https://github.com/Azure/azure-storage-php/blob/master/azure-storage-common/src/Common/SharedAccessSignatureHelper.php.

...