Я пытаюсь реализовать функцию Perl для создания токенов SAS. Делая все в соответствии с документацией (https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas), я всегда получаю сообщение об ошибке «Поля подписи не правильно сформированы».
Мой ресурс тестирования - «https://ribdkstoragepoc.blob.core.windows.net/project-poc/foo/koteyka.jpg». Переменные, заполненные моим кодом:
подписанные разрешения = 'r'
signedexpiry = '2020-05-01T07: 59: 00Z'
canonicalizedresource = '/ blob / ribdkstoragepoc / project-poc / foo / koteyka.jpg '
signatureresource =' b '
signatureversion =' 2018-03-28 '
Другие переменные - просто пустые строки. Я генерирую строку, используя следующий шаблон:
my $ stringToSign = $ permissions. "\ n". $ начало. "\ n". $ expiry. "\ n". $ canonicalizedResource. "\ n". $ идентификатор. "\ n". $ IP. "\ n". протокол "\ n". $ версия. "\ n". $ ресурс. "\ n". $ snapshotTime. "\ n". $ rs cc. "\ n". $ rscd. "\ n". $ rsce. "\ n". $ rscl. "\ n". $ rsct;
Строка для подписи:
r 2020-05-01T07:59:00Z /blob/ribdkstoragepoc/project-poc/foo/koteyka.jpg 2018-03-28 b
Расчет подписи: my $ sig = Digest :: SHA :: hmac_sha256_base64 ($ stringToSign, $ key);
Наконец, окончательный URL выглядит так: https://ribdkstoragepoc.blob.core.windows.net/project-poc/foo/koteyka.jpg?sig=YcwWvOT2FtOZGbXQxMAoSxvA2HhRmMAUp%2B6WUY%2Bjbjg&sv=2018-03-28&se=2020-05-01T07%3A59%3A00Z&sr=b&sp=r
Как я уже говорил, это не работает. У кого-нибудь есть идеи, что может быть не так?
Разобрался, что не так с вашим кодом. В основном вы используете 2018-03-28 версию Storage REST API, поэтому вам не нужно включать $resource и $snapshotTime в свои $stringToSign.
2018-03-28
$resource
$snapshotTime
$stringToSign
Более того, вам нужно будет дополнить свою подпись 1-4 = (Ref: https://github.com/smarx/waz-storage-perl/blob/master/WindowsAzure/Storage.pm#L42).
=
Исходя из этого, вот код:
use strict; use warnings; use Digest::SHA qw(hmac_sha256_base64); use MIME::Base64; my $permissions = 'r'; my $start = ''; my $expiry = '2020-01-31T00:00:00Z'; my $canonicalizedResource = '/blob/ribdkstoragepoc/project-poc/foo/koteyka.jpg'; my $identifier = ''; #my $resource = 'b'; my $IP = ''; my $version = '2018-03-28'; my $protocol = ''; #my $snapshotTime = ''; my $rscc = ''; my $rscd = ''; my $rsce = ''; my $rscl = ''; my $rsct = ''; my $stringToSign = $permissions . "\n" . $start . "\n" . $expiry . "\n" . $canonicalizedResource . "\n" . $identifier . "\n" . $IP . "\n" . $protocol . "\n" . $version . "\n" . $rscc . "\n" . $rscd . "\n" . $rsce . "\n" . $rscl . "\n" . $rsct; print $stringToSign; my $accountKey = 'your-base64-account-key'; my $sig = Digest::SHA::hmac_sha256_base64($stringToSign, decode_base64($accountKey)); $sig .= '=' x (4 - (length($sig) % 4)); print "\n---------------------\n"; print $sig; print "\n";
Попробуйте, работа.