azure - 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);
正如我已经说过的那样,这是行不通的。有谁知道可能出了什么问题?
解决方案
弄清楚你的代码有什么问题。基本上,您使用的是 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";
试试这个,它应该工作。
推荐阅读
- docker - 无法运行 docker 映像并出现此错误:无效的参考格式:存储库名称必须为小写
- flutter - 有SingleChildScrollView时如何调整屏幕底部的按钮?
- parameter-passing - 将 Terraform 中创建的参数传递到 CloudFormation 时出现问题
- c# - 如何检索多次选择的ListView C#的不同项目
- ios - 如何在 Arduino NANO 33 BLE (nRF52) 和 iPad 之间保持活动的 MIDI BLE 连接
- ios - Swift 为一个属性组合两个处理程序
- javascript - 为什么我的角色握得太久会重复?
- python-3.7 - 方程求解器引发 SyntaxError
- java - 我正在尝试从 IntelliJ 的终端运行一个 java 类,但它出现了“java.lang.UnsupportedClassVersionError”
- python - Python-在for循环中使用sum并出现错误