X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Authentication-Credential-HTTP-Proxy.git;a=blobdiff_plain;f=lib%2FCatalyst%2FPlugin%2FAuthentication%2FCredential%2FTypeKey.pm;h=cb74ae500076ae7c6cd4f7b1facd94f6c7ff6c52;hp=cec5b63f9d8066e159c515d76c8f38863bd2de41;hb=6d9b32588c09485a6a4b7fd42a98a7e6dc216ed1;hpb=52262613e28db1922b707edb9eb832c45af4683f diff --git a/lib/Catalyst/Plugin/Authentication/Credential/TypeKey.pm b/lib/Catalyst/Plugin/Authentication/Credential/TypeKey.pm index cec5b63..cb74ae5 100644 --- a/lib/Catalyst/Plugin/Authentication/Credential/TypeKey.pm +++ b/lib/Catalyst/Plugin/Authentication/Credential/TypeKey.pm @@ -4,13 +4,13 @@ use strict; use warnings; use Authen::TypeKey; -use Carp (); use File::Spec; use Catalyst::Utils (); use NEXT; use UNIVERSAL::require; +use Scalar::Util (); -our $VERSION = '0.1'; +our $VERSION = '0.3'; sub setup { my $c = shift; @@ -19,7 +19,7 @@ sub setup { $config->{typekey_object} ||= do { ( $config->{user_class} ||= - "Catalyst::Plugin::Authentication::User::Hash" )->require; + "Catalyst::Plugin::Authentication::User::Hash" )->require; $config->{key_cache} ||= File::Spec->catfile( Catalyst::Utils::class2tempdir( $c, 1 ), @@ -27,7 +27,9 @@ sub setup { my $typekey = Authen::TypeKey->new; - for (grep { exists $config->{$_} } qw/expires key_cache key_url token version skip_expiry_check/) { + for ( grep { exists $config->{$_} } + qw/expires key_cache key_url token version skip_expiry_check/ ) + { $typekey->$_( $config->{$_} ); } @@ -39,29 +41,44 @@ sub setup { sub authenticate_typekey { my ( $c, @p ) = @_; - my $p = @p ? { @p } : undef; + + my ( $user, $p ); + if ( @p == 1 ) { + if ( Scalar::Util::blessed( $p[0] ) ) { + $user = $p[0]; + Catalyst::Exception->throw( + "Attempted to authenticate user object, but " + . "user doesnt't support 'typekey_credentials'" ) + unless $user->supports(qw/typekey_credentials/); + $p = $user->typekey_credentials; + } + else { + $p = $p[0]; + } + } + else { + $p = @p ? {@p} : undef; + } my $config = $c->config->{authentication}{typekey}; my $typekey = $p && delete( $p->{typekey_object} ) || $config->{typekey_object}; - $p ||= $c->req; - - if ( my $res = $typekey->verify( $p ) ) { + $p ||= $c->req; + + if ( my $res = $typekey->verify($p) ) { $c->log->debug("Successfully authenticated user '$res->{name}'.") if $c->debug; - my $user; - - if ( my $store = $config->{auth_store} ) { + if ( !$user and my $store = $config->{auth_store} ) { $store = $c->get_auth_store($store) unless ref $store; - $user = $store->get_user( $p, $res ); + $user = $store->get_user( $res->{name}, $p, $res ); } - if ( !$user ) { + if ( !$user ) { my $user_class = $config->{user_class}; - $user = $user_class->new( $res ); + $user = $user_class->new($res); } $c->set_authenticated($user); @@ -71,7 +88,9 @@ sub authenticate_typekey { else { $c->log->debug( sprintf "Failed to authenticate user '%s'. Reason: '%s'", - $p->{name} || $p->param("name"), $typekey->errstr ) + $p->{name} || $p->param("name"), + $typekey->errstr + ) if $c->debug; return; @@ -121,25 +140,6 @@ for Catalyst. return 1; } -=head1 TYPEKEY BROKED-NESS - -Please watch: - - http://rt.cpan.org/NoAuth/Bugs.html?Dist=Authen-TypeKey - -I could only get this to properly work with TypeKey version 1 (not 1.1). - -To get around this problem configure the plugin to use version 1: - - __PACKAGE__->config( - authentication => { - typekey => { - version => 1, - token => ..., # doesn't really matter in version 1 - }, - }, - ); - =head1 DESCRIPTION This module integrates L with @@ -147,13 +147,13 @@ L. =head1 METHODS -=item authenticate_typekey %parameters +=head3 authenticate_typekey %parameters -=item authenticate_typekey +=head3 authenticate_typekey -=item EXTENDED METHODS +=head3 EXTENDED METHODS -=item setup +=head3 setup Fills the config with defaults. @@ -192,16 +192,20 @@ A store (or store name) to retrieve the user from. When a user is successfully authenticated it will call this: - $store->get_user( $parameters, $result_of_verify ); + $store->get_user( $name, $parameters, $result_of_verify ); Where C<$parameters> is a the hash reference passed to L, and C<$result_of_verify> is the value returned by L. +If this is unset, L will +be used instead. + =item user_class -If C is not set it will use this class to instantiate an object, -calling C on the class with the same C<$parameters> hash ref. +If C or the default store returns nothing from get_user, this class +will be used to instantiate an object by calling C on the class with the +return value from L. =back