Amazon-Signature4-Lite

 view release on metacpan or  search on metacpan

ChangeLog  view on Meta::CPAN


	[1.0.1]:
	* VERSION: bump
	* release-notes.md: new
	* release-notes/release-notes-1.0.1.md: new
	* lib/Amazon/Signature4/Lite.pm.in
	(sign)
	- + add_sha256_header option (default: true)
	- path must at least '/'
	- optionally add x-amz-content-sha256 (required for s3)
	- make sure query values are unescaped before escaping them

Thu Apr 30 16:44:05  Rob Lauer  rclauer@gmail.com

	[1.0.0]:

	* .gitignore: new
	* .includes/git.mk: new
	* .includes/help.mk: new
	* .includes/perl.mk: new
	* .includes/release-notes.mk: new

lib/Amazon/Signature4/Lite.pm  view on Meta::CPAN

package Amazon::Signature4::Lite;

use strict;
use warnings;

use Digest::SHA qw(sha256_hex hmac_sha256 hmac_sha256_hex);
use MIME::Base64 qw(encode_base64);
use POSIX qw(strftime);
use URI::Escape qw(uri_escape_utf8 uri_unescape);
use Data::Dumper;

our $VERSION = '1.0.1';

my @SERVICE_URL_PATTERNS = (
  qr/(s3)[.]amazonaws[.]com\z/xsm,
  qr/(s3)[.]([^.]+)[.]amazonaws[.]com\z/xsm,
  qr/(s3)[.][^.]+[.]([^.]+)[.]amazonaws[.]com\z/xsm,
  qr/(s3)[-][^.]+[.].+[.]([^.]+)[.]amazonaws[.]com\z/xsm,
  qr/^([[:alnum:]-]+)[.]([^.]+)[.]amazonaws[.]com\z/xsm,  # service.region.amazonaws.com

lib/Amazon/Signature4/Lite.pm  view on Meta::CPAN


  # sort and build canonical headers string
  my @header_keys    = sort { lc($a) cmp lc($b) } keys %sign_headers;
  my $canon_headers  = join q{}, map { lc($_) . ':' . $sign_headers{$_} . "\n" } @header_keys;
  my $signed_headers = join ';', map { lc($_) } @header_keys;

  # canonical query string - sort by encoded key then encoded value
  my $canon_query = q{};
  if ($query) {
    my @pairs = map {
      join '=', map { uri_escape_utf8( uri_unescape($_) ) } split /=/xsm, $_, 2
      }
      sort { $a cmp $b }
      split /&/xsm, $query;
    $canon_query = join '&', @pairs;
  }

  # canonical request
  my $canon_request = join "\n", $method, _encode_path($path), $canon_query, $canon_headers, $signed_headers, $payload_hash;

  # credential scope

lib/Amazon/Signature4/Lite.pm  view on Meta::CPAN

  # return merged headers ready for HTTP::Tiny
  return { %sign_headers, 'Authorization' => $authorization, };
}

########################################################################
sub _encode_path {
########################################################################
  my ($path) = @_;

  # encode each segment individually, preserving slashes
  return join '/', map { uri_escape_utf8($_) } split m{/}xsm, $path, -1;
}

1;

__END__

=head1 NAME

Amazon::Signature4::Lite - Lightweight AWS Signature Version 4 signing



( run in 0.813 second using v1.01-cache-2.11-cpan-9581c071862 )