首页 > 解决方案 > Azure:手动创建 SAS

问题描述

我正在尝试实现一个用于创建 SAS 令牌的 Perl 函数。根据文档(https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas)做所有事情,我总是收到错误“签名字段格式不正确”。

我的测试资源是“ https://ribdkstoragepoc.blob.core.windows.net/project-poc/foo/koteyka.jpg ”。我的代码填充的变量:

签名权限 = 'r'

已签名到期 = '2020-05-01T07:59:00Z'

canonicalizedresource = '/blob/ribdkstoragepoc/project-poc/foo/koteyka.jpg'

签名资源 = 'b'

签名版本 = '2018-03-28'

其他变量只是空行。我使用以下模式生成一个字符串:

我的 $stringToSign = $permissions 。“\n”。$开始。“\n”。$到期。“\n”。$canonicalizedResource 。“\n”。$标识符。“\n”。$IP 。“\n”。$协议。“\n”。$版本。“\n”。$资源。“\n”。$快照时间。“\n”。$rscc 。“\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

正如我已经说过的那样,这是行不通的。有谁知道可能出了什么问题?

标签: azureperlblob

解决方案


弄清楚你的代码有什么问题。基本上,您使用的是 Storage REST API 版本,因此2018-03-28您不需要在.$resource$snapshotTime$stringToSign

此外,您需要用 1-4 填充您的签名=(参考: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";

试试这个,它应该工作。


推荐阅读