Я следил за последней записью от 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 и почему я продолжаю получать ошибки запросов, связанные с аутентификациейТион?