Catalyst::Plugin::Authentication::Credential::OpenID - OpenID credential for Catalyst::Auth framework


Catalyst-Plugin-Authentication-Credential-OpenID documentation Contained in the Catalyst-Plugin-Authentication-Credential-OpenID distribution.

Index


Code Index:

NAME

Top

Catalyst::Plugin::Authentication::Credential::OpenID - OpenID credential for Catalyst::Auth framework

SYNOPSIS

Top

  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
  <form action="[% c.uri_for('/signin_openid') %]" method="GET">
  <input type="text" name="openid_url" class="openid" />
  <input type="submit" value="Sign in with OpenID" />
  </form>

DESCRIPTION

Top

Catalyst::Plugin::Authentication::Credential::OpenID is an OpenID credential for Catalyst::Plugin::Authentication framework.

METHODS

Top

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 user_class config, which defaults to Catalyst::Plugin::Authentication::User::Hash, will be instantiated with the following parameters.

By default, authenticate_openid method looks for claimed URI parameter from the form field named openid_url, openid_identifier or claimed_uri. If you want to use another form field name, call it like:

  $c->authenticate_openid( $c->req->param('myopenid_param') );

url
display
rss
atom
foaf
declared_rss
declared_atom
declared_foaf
foafmaker

See Net::OpenID::VerifiedIdentity for details.

DIFFERENCE WITH Authentication::OpenID

Top

There's already Catalyst::Plugin::Authentication::OpenID (Auth::OpenID) and this plugin tries to deprecate it.

AUTHOR

Top

Six Apart, Ltd. <cpan@sixapart.com>

LICENSE

Top

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

SEE ALSO

Top

Catalyst::Plugin::Authentication::OpenID, Catalyst::Plugin::Authentication::Credential::Flickr


Catalyst-Plugin-Authentication-Credential-OpenID documentation Contained in the Catalyst-Plugin-Authentication-Credential-OpenID distribution.

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__