package Catalyst::Plugin::Authentication::Credential::OpenID; use strict; use warnings; our $VERSION = '0.03'; use Net::OpenID::Consumer; use LWPx::ParanoidAgent; use UNIVERSAL::require; sub setup { my $c = shift; my $config = $c->config->{authentication}->{openid} ||= {}; ( $config->{user_class} ||= "Catalyst::Plugin::Authentication::User::Hash" )->require; $c->NEXT::setup(@_); } sub authenticate_openid { my($c, $uri) = @_; my $config = $c->config->{authentication}->{openid}; my $csr = Net::OpenID::Consumer->new( ua => LWPx::ParanoidAgent->new, args => $c->req->params, consumer_secret => sub { $_[0] }, ); my @try_params = qw( openid_url openid_identifier claimed_uri ); if ($uri ||= (grep defined, @{$c->req->params}{@try_params})[0]) { my $current = $c->req->uri; $current->query(undef); # no query my $identity = $csr->claimed_identity($uri) or Catalyst::Exception->throw($csr->err); my $check_url = $identity->check_url( return_to => $current . '?openid-check=1', trust_root => $current, delayed_return => 1, ); $c->res->redirect($check_url); return 0; } elsif ($c->req->param('openid-check')) { if (my $setup_url = $csr->user_setup_url) { $c->res->redirect($setup_url); return 0; } elsif ($csr->user_cancel) { return 0; } elsif (my $identity = $csr->verified_identity) { my $user = +{ map { $_ => scalar $identity->$_ } qw( url display rss atom foaf declared_rss declared_atom declared_foaf foafmaker ) }; my $store = $config->{store} || $c->default_auth_store; if ( $store and my $store_user = $store->get_user( $user->{url}, $user ) ) { $c->set_authenticated($store_user); } else { $user = $config->{user_class}->new($user); $c->set_authenticated($user); } return 1; } else { Catalyst::Exception->throw("Error validating identity: " . $csr->err); } } else { return 0; } } 1; __END__ =for stopwords Flickr OpenID TypeKey app auth callback foaf foafmaker plugins rss url URI =head1 NAME Catalyst::Plugin::Authentication::Credential::OpenID - OpenID credential for Catalyst::Auth framework =head1 SYNOPSIS use Catalyst qw/ Authentication Authentication::Credential::OpenID Session Session::Store::FastMmap Session::State::Cookie /; # MyApp.yaml -- optional authentication: openid: use_session: 1 user_class: MyApp::M::User::OpenID # whatever in your Controller pm sub default : Private { my($self, $c) = @_; if ($c->user_exists) { ... } } sub signin_openid : Local { my($self, $c) = @_; if ($c->authenticate_openid) { $c->res->redirect( $c->uri_for('/') ); } } # foo.tt
=head1 DESCRIPTION Catalyst::Plugin::Authentication::Credential::OpenID is an OpenID credential for Catalyst::Plugin::Authentication framework. =head1 METHODS =over 4 =item authenticate_openid $c->authenticate_openid; Call this method in the action you'd like to authenticate the user via OpenID. Returns 0 if auth is not successful, and 1 if user is authenticated. User class specified with I