perl版阿里云签名公共参数方法

阿里云的签名验证真心蛋疼,比如时间戳做了二次utf8转码,文档中的签名结果与实际不相符等.

package AliYun;
use Moose;
use Redis;
use POSIX qw(strftime);
use Data::Dumper;
use Digest::HMAC_SHA1 qw(hmac_sha1 hmac_sha1_hex);
use JSON;
use URI::Escape;
use LWP::UserAgent;

#定义签名常量
has ‘accessKeyId‘     => ( isa => ‘Str‘, is => ‘ro‘, required => 1 );
has ‘accessKeySecret‘ => ( isa => ‘Str‘, is => ‘ro‘, required => 1 );
has ‘format‘ =>
    ( isa => ‘Str‘, is => ‘rw‘, required => 1, default => ‘json‘ );
has ‘signatureMethod‘ =>
    ( isa => ‘Str‘, is => ‘rw‘, required => 1, default => ‘HMAC-SHA1‘ );
has ‘signatureVersion‘ =>
    ( isa => ‘Str‘, is => ‘rw‘, required => 1, default => ‘1.0‘ );
has ‘serverUrl‘ => ( isa => ‘Str‘, is => ‘rw‘, required => 1 );
has ‘version‘ =>
    ( isa => ‘Str‘, is => ‘rw‘, required => 1, default => ‘2015-01-09‘ );
has ‘requestMethod‘ =>
    ( isa => ‘Str‘, is => ‘rw‘, required => 1, default => ‘GET‘ );

has ‘timestamp‘ => (
    isa      => ‘Str‘,
    is       => ‘rw‘,
    required => 1,
    default  => strftime( "%Y-%m-%dT%H:%M:%SZ", localtime( time - 3600 * 8 ) )
);

sub params_init {
    my $self = shift;
    my ($actionParams) = @_;
    my $apiParams;

#公共参数
    $apiParams->{AccessKeyId}      = $self->accessKeyId;
    $apiParams->{SignatureMethod}  = $self->signatureMethod;
    $apiParams->{SignatureVersion} = $self->signatureVersion;
    $apiParams->{TimeStamp}        = $self->timestamp;
    $apiParams->{SignatureNonce}   = rand;
    $apiParams->{Version}          = $self->version;
    $apiParams->{Format}           = $self->format;

#请求参数与公共参数合并
    $apiParams->{$_} = $actionParams->{$_} for keys %$actionParams;

    $apiParams->{Signature} = $self->compute_signature($apiParams);

    my $requestUrl = $self->serverUrl . "?";
    for my $key ( keys %$apiParams ) {
        my $value = uri_escape_utf8 $apiParams->{$key};
        $requestUrl .= "$key=" . $value . "&";
    }

#删除最后一个字符&
    $requestUrl = substr( $requestUrl, 0, -1 );
    my $ua     = LWP::UserAgent->new();
    my $result = $ua->get($requestUrl);

    return decode_json $result->content;

}

sub compute_signature {
    my ( $self, $paramData ) = @_;
    my $accessKeySecret = $self->accessKeySecret;
    my $canonicalizedQueryString;
    my $strArr;
    for my $key ( sort keys %$paramData ) {
        push @$strArr,
            uri_escape_utf8($key) . "="
            . uri_escape_utf8( $paramData->{$key} );
    }
    $canonicalizedQueryString = join "&", @$strArr;

# 生成用于计算签名的字符串 stringToSign

    my $stringToSign
        = ‘GET&%2F&‘ . uri_escape_utf8($canonicalizedQueryString);

# 计算签名,注意accessKeySecret后面要加上字符‘&‘
    my $hmac = Digest::HMAC_SHA1->new( $accessKeySecret . "&" );
    $hmac->add($stringToSign);
    my $signStr = $hmac->b64digest;
    $signStr =~ s/$/=/g;
    return $signStr;
}
1;
时间: 2024-12-10 20:29:44

perl版阿里云签名公共参数方法的相关文章

Signature 阿里云签名值获取方法

<?php function CreateUploadVideo(){ $a='LT*****Q8'; $ck='hEro****vqPbj'; $h_8_time = time() - 8*60*60; $get_key = array('Format','Version','AccessKeyId','SignatureMethod','Timestamp','SignatureNonce','SignatureVersion','Action','Title','FileName'); $

[技术博客]阿里云签名机制字符串的C语言实现

[技术博客]阿里云签名机制字符串的C语言实现 问题描述见:阿里云签名机制 话不多说,上字符串函数转化函数代码 bool AlicloudRequest::sendV2Request() { if( query_parameters.find( "Action" ) == query_parameters.end() ) { this->errorCode = "E_INTERNAL"; this->errorMessage = "No acti

企业要把网站迁入阿里云服务器怎么办?方法看这里!

企业要把网站从其它服务器迁入阿里云服务器怎么办?方法看这里! 企业网站数据迁移上阿里云有以下两种方式:1)企业可以通过阿里云提供内置工具与帮助文档自己完成IT环境迁移工作,即:自助服务:2)企业还可以通过阿里云的合作伙伴,通过合作伙伴提供技术支持,帮助企业完成IT环境迁移工作,即:合作伙伴支持.点我了解详情 下面重点来了解一下第一种方法,即自助迁移.自助迁移需求用到阿里云自研的“迁云工具”来快速方便地实现网站迁移目的.阿里云迁云工具,简称迁云工具,是一个阿里云自主研发的能将计算机磁盘中的操作系统

CentOS8 使用 aliyun 阿里云 镜像站点的方法

CentOS8现已可使用国内的aliyun阿里云镜像站,方法如下: 用cd命令切换到yum.repos目录,备份原始的3个repo文件:cd /etc/yum.repos.d/sudo cp CentOS-AppStream.repo CentOS-AppStream.repo.baksudo cp CentOS-Base.repo CentOS-Base.repo.baksudo cp CentOS-Extras.repo CentOS-Extras.repo.bak 编辑上面3个repo文件

阿里云RDS-MYSQL数据库参数设置,K哥

2016.9.2 最近被阿里云的数据库要搞疯掉了 自打阿里云抽风,非要取消myisam引擎,都换成innodb 没事总是主备切换,也没有错误日志 一问客服就是物理机波动,擦,波动是什么???????? 服务器自己跳舞了吗 看了看参数设置,很多都不知道 这两天有时间自己搜索整理了下 发给大家,有需要的看看 我的服务器应用主要是WEB网站服务 有一些不懂的地方或者不对的地方,还请大牛不吝赐教! 回复在评论中就可以了,thank you 我是K哥 auto_increment_offset表示自增长字

公司某些服务器没法ssh阿里云服务器的解决方法

一.故障现象 1)在公司网络某些主机上的ssh阿里云主机报错: ---------------------------------------------------------------------------- OpenSSH_6.6.1, OpenSSL 1.0.1e-fips 11 Feb 2013 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 56: Ap

docke镜像上传到dockerhub仓库和阿里云docker仓库的方法

操作指南 1.  登录阿里云docker registry: $ sudo docker login --username=linjiaxin897591495 registry.cn-hangzhou.aliyuncs.com 登录registry的用户名是您的阿里云账号全名,密码是您开通namespace时设置的密码. 你可以在镜像管理首页点击右上角按钮修改docker login密码. 从registry中拉取镜像: $ sudo docker pull registry.cn-hangz

阿里云 搭建vpn的方法

由于学习原因,必须使用外网,可是……你们都懂的 我发现免费的FQ软件是下一个,一个没法用,gogent 配置了2小时也是白搭,还有网上到处都有卖VPN的,这个倒是管用,查了下VPN的原理,我自己有个阿里云的服务器,我ping了一下可以连接google,所以打算自己搭建个VPN. 1,开始百度,还有gfsoso VPN搭建教程 2,搜罗到攻略,开始尝试: 在服务器中执行:wget http://latrell.me/wp-content/uploads/vpn_centos6.sh 地址或者:wg

阿里云挂载数据盘方法

df -lh查看是否已经挂载fdisk -l 查看需要挂载的数据盘信息mount /dev/vdb /mntecho '/dev/vdb /mnt ext3 defaults 0 0' >> /etc/fstabdf -lhreboot df -lh 检查是否挂载成功 服务器为专有网络时,需要在安全组配置入网规则