Authen-HTTP-Signature
view release on metacpan or search on metacpan
lib/Authen/HTTP/Signature.pm view on Meta::CPAN
package Authen::HTTP::Signature;
use 5.010;
use strict;
use warnings;
use Moo;
use Scalar::Util qw(blessed);
use Carp qw(confess);
use HTTP::Date qw(time2str);
use Data::Dumper;
=head1 NAME
Authen::HTTP::Signature - Sign and validate HTTP headers
=head1 VERSION
Version 0.03
=cut
our $VERSION = '0.03';
=head1 SYNOPSIS
Create signatures:
use 5.010;
use Authen::HTTP::Signature;
use File::Slurp qw(read_file);
use HTTP::Request::Common;
my $key_string = read_file("/my/priv/key.pem") or die $!;
my $signer = Authen::HTTP::Signature->new(
key => $key_string,
key_id => 'Test',
);
my $req = POST('http://example.com/foo?param=value&pet=dog',
Content_Type => 'application/json',
Content_MD5 => 'Sd/dVLAcvNLSq16eXua5uQ==',
Content_Length => 18,
Content => '{"hello": "world"}'
);
my $signed_req = $signer->sign($req);
# adds then signs the 'Date' header with private key using
# RSA-SHA256, then adds 'Authorization' header to
# $req
Validate signatures:
use 5.010;
use Authen::HTTP::Signature::Parser;
use HTTP::Request::Common;
use File::Slurp qw(read_file);
use Try::Tiny;
my $req = POST('http://example.com/foo?param=value&pet=dog',
Content_Type => 'application/json',
Content_MD5 => 'Sd/dVLAcvNLSq16eXua5uQ==',
Content_Length => 18,
Date => 'Thu, 05 Jan 2012 21:31:40 GMT',
Authorization => q{Signature keyId="Test",algorithm="rsa-sha256",signature="ATp0r26dbMIxOopqw0OfABDT7CKMIoENumuruOtarj8n/97Q3htHFYpH8yOSQk3Z5zh8UxUym6FYTb5+A0Nz3NRsXJibnYi7brE/4tx5But9kkFGzG+xpUmimN4c3TMN7OFH//+r8hBf7BT9/GmHDUVZT2JzWGLZES...
Content => '{"hello": "world"}'
);
my $p;
try {
$p = Authen::HTTP::Signature::Parser->new($req)->parse();
}
catch {
die "Parse failed: $_\n";
};
my $key_string = read_file("/my/pub/key.pem") or die $!;
$p->key( $key_string );
if ( $p->verify() ) {
say "Request is valid!"
}
else {
say "Request isn't valid";
};
=head1 PURPOSE
This is an implementation of the IETF HTTP Signatures specification authentication scheme. The idea is to authenticate
connections (over HTTPS ideally) using either an RSA keypair or a symmetric key by signing a set of header
values.
If you wish to use SSH keys for validation as in Joyent's proposal, check out L<Convert::SSH2>.
=head1 ATTRIBUTES
These are Perlish mutators; give an argument to set a value or no argument to get the current value.
=over
=item algorithm
The algorithm to use for signing. Read-only.
One of:
=over
=item * C<rsa-sha1>
=item * C<rsa-sha256> (B<default>)
=item * C<rsa-sha512>
=item * C<hmac-sha1>
( run in 0.886 second using v1.01-cache-2.11-cpan-39bf76dae61 )