Catalyst::Authentication::Credential::OpenID(CodeRepos の方) でログイン

前の記事で masaki さんに「そこは auto_create するところな気がします.」と教えてもらったのでちょろちょろっといじってみる。
個人的には CPAN に上がっている方より CodeRepos に上がっている方が好きなので。

Bakelatte/etc/conf/bakelatte.yml

authentication:
  default_realm: member
  realms:
    member:
      credential:
        class: OpenID
      store:
        class: DBIx::Class
        user_class: DBIC::Bakelatte::Member
        id_field: url
      auto_create_user: 1

Bakelatte/lib/Bakelatte/Controller/Login.pm

=head2 do_login

=cut

sub do_login : Local {
    my ( $self, $c ) = @_;

    $c->log->info('*** Bakelatte::Controller::Login::do_login ***');

    $c->req->base( URI->new( $c->config->{service_url} ) );
    $c->req->uri( URI->new( $c->config->{service_url} . $c->req->path ) );
    if ( $c->authenticate ) {
        ## SUCCESS
        $c->res->redirect('/');
    } else {
        ## FAILURE
        $c->load_template('login/index.tt');
    }
}

Bakelatte/lib/Bakelatte/Schema/Member.pm

package Bakelatte::Schema::Member;

use strict;
use warnings;
use base qw/ DBIx::Class /;
use DateTime;

__PACKAGE__->load_components( qw/ ResultSetManager +Bakelatte::DBIC Core / );
__PACKAGE__->table('member');
__PACKAGE__->add_columns( qw/
    id
    created_on
    modified_on
    nickname
    atom
    declared_atom
    declared_foaf
    declared_rss
    display
    foaf
    foafmaker
    rss
    url
/);
__PACKAGE__->set_primary_key('id');

sub auto_create : ResultSet {
    my ( $class, $hashref, $c ) = @_;

    my $dt     = DateTime->now( time_zone => $c->config->{time_zone} );
    my $member = $class->create( {
        created_on    => $dt || undef,
        modified_on   => $dt || undef,
        nickname      => undef,
        atom          => $hashref->{atom} || undef,
        declared_atom => $hashref->{declared_atom} || undef,
        declared_foaf => $hashref->{declared_foaf} || undef,
        declared_rss  => $hashref->{declared_rss} || undef,
        display       => $hashref->{display} || undef,
        foaf          => $hashref->{foaf} || undef,
        foafmaker     => $hashref->{foafmaker} || undef,
        rss           => $hashref->{rss} || undef,
        url           => $hashref->{url} || undef,
    } );

    return $member;
}

1;

これくらい実装してグッとガッツポーズをするとこんなのが出来上がる。
livedoor, yahoo, jugem, typekey などなどの OpenID でログインすることが出来る。はてなはアカウント持ってないから試してないけどググッとガッツポーズすれば何とかいけるはず。

auto_create って今回はじめて使ってみたけど、こんな感じの実装でよいのかしらん?
ドキュメント読んでも config の設定の仕方とか auto_create の定義の仕方とかよくわからなかった。 Authentication 周りのソースを読むと、どうも自分で実装しなくちゃいけないのかなぁ・・・、ってなった。
第3引数に $c が渡ってきちゃうとことか見ると、たぶん他のやり方があるんじゃないかなぁなんて気がしてます。

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://hibinokoto.jp/mt/mt-tb.cgi/267
Listed below are links to weblogs that reference
Catalyst::Authentication::Credential::OpenID(CodeRepos の方) でログイン from 日々のこと

Home > 仕事のこと > Catalyst::Authentication::Credential::OpenID(CodeRepos の方) でログイン

Search
Feeds

Return to page top