Humanity

Edit the world by your favorite way

PerlでWSSE認証

スクリプトで使ってたけどもう使わなくなった(LWP::Authen::Wsseに任せることにした)ので保存用としてメモしておく。

require Digest::SHA1;
require MIME::Base64;
require DateTime;


# wsse authetication
sub get_credentials {
    my ($user, $pass) = @_;

    my $sha1 = \&Digest::SHA1::sha1;
    my $encode_base64 = \&MIME::Base64::encode_base64;
    
    my $nonce = $sha1->($sha1->(time() . {} . rand() . $$));
    my $now = DateTime->now->iso8601 . 'Z';
    my $digest = $encode_base64->($sha1->($nonce . $now . $pass || ''), '');
    return sprintf(
        q(UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"),
                                $user, $digest,  $encode_base64->($nonce, ''), $now
    );
}

使い方

my $req = HTTP::Request->new(GET => "http://d.hatena.ne.jp/tyru/atom/blog");
$req->header('X-WSSE' => get_credentials('tyru', '*******'));