Azure表服务:从Perl在REST API中授权



我正在尝试通过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字符串:

  1. 从一个空字符串("(开始,附加一个正斜杠(/(,后跟拥有资源的帐户名称已访问。

  2. 附加资源的编码URI路径,不带任何查询参数。

  3. 检索资源URI上的所有查询参数,包括comp参数(如果存在(。

  4. 将所有参数名称转换为小写。

  5. 按参数名称按字典顺序升序对查询参数进行排序

  6. URL解码每个查询参数的名称和值。

  7. 在每个名称值对之前包含一个换行符(\n(。

  8. 按以下格式将每个查询参数名称和值附加到字符串中,确保在名称和值:parameter-name:parameter-value

  9. 如果查询参数有多个值,请按字典顺序对所有值进行排序,然后将它们包含在逗号分隔的列表中:parameter-name:parameter-value-1,parameter-value-2,parameter-value-n

最新更新