Amazon-PAApi5-Signature
view release on metacpan or search on metacpan
lib/Amazon/PAApi5/Signature.pm view on Meta::CPAN
}
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) = @_;
my $signature_key = $self->_get_signature_key;
return lc(hmac_sha256_hex($string_to_sign, $signature_key));
}
sub _build_authorization_string {
my ($self, $signature) = @_;
return $self->hmac_algorithm . ' '
. 'Credential=' . join('/', $self->access_key, $self->_get_date, $self->region, $self->service, $self->aws4_request)
. ',SignedHeaders=' . $self->str_signed_header
. ',Signature=' . $signature
;
}
sub headers {
my ($self) = @_;
my $aws_headers = $self->aws_headers;
$aws_headers->{'content-encoding'} = 'amz-1.0';
$aws_headers->{'content-type'} = 'application/json; charset=UTF-8';
$aws_headers->{'host'} = $self->host;
$aws_headers->{'x-amz-date'} = $self->x_amz_date;
$aws_headers->{'x-amz-target'} = $self->_build_amz_target;
my $canonical_url = $self->_prepare_canonical_url;
my $string_to_sign = $self->_prepare_string_to_sign($canonical_url);
my $signature = $self->_calculate_signature($string_to_sign);
$aws_headers->{Authorization} = $self->_build_authorization_string($signature);
$self->aws_headers($aws_headers);
return %{$aws_headers};
}
sub headers_as_arrayref {
return [shift->headers];
}
sub headers_as_hashref {
return {shift->headers};
}
sub _get_signature_key {
my ($self) = @_;
my $k_date = hmac_sha256($self->current_date, 'AWS4' . $self->secret_key);
my $k_region = hmac_sha256($self->region, $k_date);
my $k_service = hmac_sha256($self->service, $k_region);
my $k_signing = hmac_sha256($self->aws4_request, $k_service);
return $k_signing;
}
sub _build_amz_target {
return 'com.amazon.paapi5.v1.ProductAdvertisingAPIv1.' . shift->operation;
}
sub _get_time_stamp {
return strftime("%Y%m%dT%H%M%SZ", gmtime()); # 20191128T235650Z
}
sub _get_date {
return strftime("%Y%m%d", gmtime()); # 20191128
}
sub to_request {
my ($self) = @_;
return {
method => $self->http_method,
uri => $self->req_url,
headers => $self->headers_as_hashref,
content => $self->payload,
};
}
1;
( run in 2.202 seconds using v1.01-cache-2.11-cpan-6aa56a78535 )