我正在尝试通过REST API从我的Perl脚本在Azure表中进行授权。根据MSDN文档,基于我对类似任务的了解(我为Blob服务创建了一个类似的脚本,效果很好(,我开发了一个简单的脚本:
use strict;
use warnings;
use Digest::SHA qw(hmac_sha256_base64);
use HTTP::Date;
use HTTP::Request;
use LWP::UserAgent;
use MIME::Base64;
my $account = 'myaccount';
my $key = 'Nf2b/ZSY+a...7ZT0Q==';
my $decoded_key = decode_base64( $key );
my $uri = "https://$account.table.core.windows.net/?restype=service&comp=properties";
my $method = 'GET';
my $req = HTTP::Request->new($method, $uri);
my $date = time2str();
my $canonicalized_resource = "/$account/nrestype:servicencomp:properties";
my $string_to_sign =
"$methodn" .
"n" . # content-md5
"n" . # content-type
"$daten".
$canonicalized_resource;
my $sig = hmac_sha256_base64($string_to_sign, $decoded_key );
$sig .= '=' x (4 - (length($sig) % 4));
$req->authorization("SharedKey $account:$sig");
$req->header('x-ms-version', '2019-02-02');
$req->header('x-ms-date', $date);
$req->date($date);
my $ua = LWP::UserAgent->new();
my $resp = $ua->request($req);
unless($resp->is_success){
die "Request failed: " . $resp->status_line . ". Signed string: " . $string_to_sign;
}
任务非常简单:通过获取表服务属性来检查我的代码。不幸的是,它不起作用!我得到:
请求失败:403服务器无法对请求进行身份验证。确保Authorization标头的值格式正确,包括签名。
SharedKey
不正确。然而,我对Perl并不熟悉。你可以参考C#的例子。
Plz检查您的CanonicalizedResource
字符串:
从一个空字符串("(开始,附加一个正斜杠(/(,后跟拥有资源的帐户名称已访问。
附加资源的编码URI路径,不带任何查询参数。
检索资源URI上的所有查询参数,包括comp参数(如果存在(。
将所有参数名称转换为小写。
按参数名称按字典顺序升序对查询参数进行排序
URL解码每个查询参数的名称和值。
在每个名称值对之前包含一个换行符(\n(。
按以下格式将每个查询参数名称和值附加到字符串中,确保在名称和值:
parameter-name:parameter-value
如果查询参数有多个值,请按字典顺序对所有值进行排序,然后将它们包含在逗号分隔的列表中:
parameter-name:parameter-value-1,parameter-value-2,parameter-value-n