鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

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();
}