Rails4 + Devise + OmniAuthで複数のログイン機構を作る

Pocket

やりたいこと

  • adminとuserでmodelを分けて、別々のログイン機構を持ちたい。
  • adminは通常のdeviseで、emailとpasswordを使用したログイン。
  • userはdevise+Omniauthで、Twitter, Facebook, Githubのアカウントを利用してログイン。
    初回アクセス時、各サービスでOAuthの認証を受けてcallbackが呼ばれた際に渡されたauth情報を元に、別途emailやpasswordを持たずにユーザー登録。
  • まだ検証中なので実装のための下調べをおおまかにメモった感じなので実装の場合は気をつける。

    材料

    ・Rails(4)
    ・Devise
    ・Omniauth
    ・Omniauth-twitter
    ・Omniauth-facebook

    Deviseのインストールと各種部品の作成

    devise:installをして、管理対象となるユーザーのVMCを作成

    routesでパスを分ける

    routesでadmin/sign_inとcustomer/sign_inといった感じに処理を分ける

    ここでscope長い問題

    namespace :adminの以下に:admin_usersってやった余波でscopeが冗長に。
    user_signed_in?も、「admin_admin_user_signed_in?」みたいになっちゃって長い。
    設計ミスだなーどうしようかなーと思いつつ検証なのでそのまま進める。
    本当はnamespace以下じゃなくてdevise_forのpathにadminと記述して
    他のadmin系処理だけnamespace以下に記述すればいいんだねって気づいた時にはすでにおすしなのであった。

    deviseのconfigを設定する

    deviseのconfig設定で、scoped_viewsをtrueに設定し
    omniauth用のAPP IDなどを設定しておく。KEYの類は環境変数に。
    local開発時はdotenv-railsというgemで環境変数を管理すると便利ねぇ。

    modelの設定

    FBだけfirst_or_createの書き方だとうまくusernameが保存できなかった。

    omniauth_callbacks_controllerを作る

    devise:controllersで入れ物は作ってくれているので、中に処理を追加する。
    それぞれのSNS別に処理を作っても、共通で作ってもよい。

    Viewにログインのリンクを設置

    せっかくなのでPNotifyでログインしたよメッセージを出す

    https://github.com/sciactive/pnotify/wiki/Rails-flash-integration-with-PNotify
    Gemfileに追加してbundle installしておく

    application_controllerにfilterを追加する

    CSSを呼ぶ

    flash.jsを作る
    このへんは通常のPNotifyと同じなのでPNotifyの説明を見ながらいい感じにする。

    JSも呼ぶ

    Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です