Amazon-PAApi5-Signature
view release on metacpan or search on metacpan
lib/Amazon/PAApi5/Signature.pm view on Meta::CPAN
package Amazon::PAApi5::Signature;
use strict;
use warnings;
use Carp qw/croak/;
use POSIX qw/strftime/;
use Digest::SHA qw/sha256_hex hmac_sha256 hmac_sha256_hex/;
use Class::Accessor::Lite (
rw => [qw/
access_key
secret_key
payload
resource_path
operation
host
region
aws_headers
str_signed_header
/],
ro => [qw/
service
http_method
hmac_algorithm
aws4_request
x_amz_date
current_date
/],
);
our $VERSION = '0.05';
sub new {
my $class = shift;
my $access_key = shift or croak 'access_key is required';
my $secret_key = shift or croak 'secret_key is required';
my $payload = shift or croak 'payload is required';
my $opt = shift || {};
my $operation = $opt->{operation} || 'SearchItems';
my $resource_path = $opt->{resource_path} ? $opt->{resource_path} : '/paapi5/' . lc($operation);
return bless {
access_key => $access_key,
secret_key => $secret_key,
payload => $payload,
resource_path => $resource_path,
operation => $operation,
host => $opt->{host} || 'webservices.amazon.com',
region => $opt->{region} || 'us-east-1',
service => $opt->{service} || 'ProductAdvertisingAPI',
http_method => $opt->{http_method} || 'POST',
hmac_algorithm => $opt->{hmac_algorithm} || 'AWS4-HMAC-SHA256',
aws4_request => $opt->{aws4_request} || 'aws4_request',
x_amz_date => $class->_get_time_stamp,
current_date => $class->_get_date,
aws_headers => {},
str_signed_header => '',
}, $class;
}
sub req_url {
my ($self) = @_;
return sprintf("https://%s%s", $self->host, $self->resource_path);
}
sub _prepare_canonical_url {
my ($self) = @_;
my $canonical_url = $self->http_method . "\n";
$canonical_url .= $self->resource_path . "\n\n";
my $signed_headers = '';
for my $key (grep { $_ !~ m!content-type! } sort keys %{$self->aws_headers}) {
$signed_headers .= lc($key) . ';';
$canonical_url .= lc($key) . ':' . $self->aws_headers->{$key} . "\n";
}
$canonical_url .= "\n";
$self->str_signed_header(substr($signed_headers, 0, -1)); # remove ';'
$canonical_url .= $self->str_signed_header . "\n";
$canonical_url .= sha256_hex($self->payload);
return $canonical_url;
}
sub _prepare_string_to_sign {
my ($self, $canonical_url) = @_;
return join("\n",
$self->hmac_algorithm,
$self->x_amz_date,
join('/', $self->current_date, $self->region, $self->service, $self->aws4_request),
sha256_hex($canonical_url),
);
}
sub _calculate_signature {
my ($self, $string_to_sign) = @_;
( run in 1.975 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )