Mojoliciousを使った、認証まわりのコード
マイページ、コース登録画面は要認証とするので、underの後、loginしてからそれらのページへリダイレクトさせる。
ログイン単独の機能もつけたい、認証がすんだら/へリダイレクトしたい。
ツイッター、フェースブックでのOAUTH認証(site,user_idで一意)をサポートするが、アプリ内でのユーザID(idが一意)は別管理にしたい。
これで、いいのだろうか??でも、何とか動いている感じ。 少しコーディングが進んですっきりしました。
Web.pmでは・・・
#hook $self->hook( after_dispatch => sub { my $c = shift; if ( defined $c->session('user_id') ) { if ( !defined $c->session('id') ) { my $row = $c->db->single( "User", { site => $self->session('site'), user_id => $self->session('user_id') } ); if ( !defined $row ) { $row = $c->db->insert( "User", { site => $self->session('site'), screen_name => $self->session('screen_name'), user_id => $self->session('user_id'), created_at => \"now()" } ); } $c->session( 'id' => $row->id ); } } } ); # Router my $r = $self->routes; my $logged_in = $r->under->to( cb => sub { my $self = shift; if ( $self->session('user_id') ) { return 1; } else { $self->session( redirect_path => $self->req->url->path ); $self->redirect_to('/login'); } } ); ・・・ $r->get('/auth/twitter/callback')->to( cb => sub { my $self = shift; my $redirect = $self->session("redirect_path"); $self->redirect_to($redirect); } ); $r->get('/auth/facebook/callback')->to( cb => sub { my $self = shift; my $redirect = $self->session("redirect_path"); } );
loginのコントローラでは、リダイレクトパスが指定されていない場合、loginが直接呼ばれたと判断して、リダイレクトパスを/と書き換える。
sub login { my $self = shift; if (!defined $self->session("redirect_path")){ $self->session("redirect_path", "/"); } # Render template "root/login.html.ep" $self->render(); }