railsでfacebookを用いた、ソーシャルログイン(および新規登録)を実装
自身の記憶定着用の備忘録
【参考にした記事】
device:gemの公式
https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
実際の実装に使用させていただいた記事
https://qiita.com/keirof1892/items/4d086e5ed0872dee7dac
deviceを使わず実装しているため、概念的な理解に使用させていただいた記事
https://qiita.com/memetics/items/214babcebae32c52933c
実装の流れ
①facebook divに登録
②omniauthの導入
③snsからの情報を記録するテーブル(sns_credential )の作成
④userとsns_credentialアソシエーションの設定
⑤facebookから情報を取得することを許可するための環境変数の設定
⑥userモデルのdeviseに:omniauthable,omniauth_providers:の追加
⑦self.find_oauth(auth)メソッドをuserモデルに設定
facebookから得た情報はauth.info.〇〇で表現できる。
メソッド内の条件分岐は
1.自身のアプリにすでにsns_credentialの登録があるユーザーかどうか
2.自身のアプリにすでにuserの登録があるかどうか
分ける。
条件分岐の意図は userがない場合は新規作成(sing_up)、
userある場合は(sign_in)させるため.
sns_credentialのテーブルにすでに、データが存在する場合は、
そのデータを用い て、ログインする。sns_credentialの情報がない場合は、
facebookから取得した情報を登録し、その情報を持ってログインする。
それぞれの情報を帰り値として返し、メソッドの呼び出し元に返す。
⑧omniauth_callbacks_controller.rbの作成。
⑦の条件分岐によって取得した値を用いて、アクションを設定する。
すでにuserがある場合はログイン、
userがない場合は新規登録画面に遷移する。
新規登録に遷移の場合はnicknameとmailアドレスをfacebook側から取得して
いるので、そのデータを新規登録画面にデフォルトで反映させておく。
⑨コールバック、facebookwを用いた新規登録の際のルーティングを設定。
⑩新規登録の実装。facebookからの登録の場合はパスワード設定することなく、
新規登録を完成させる。sns_credentialテーブルにuid(ユーザーの識別番号)と
いうカラムを設定し、新規登録のアクションでuser_idと紐つけることで、
ユーザーとfacebookの情報を紐つけてデータベースに登録する。
facebook登録のボタンは、任意のところにlink_toで設定すればok
結構詰まりました。
しっかりdeviceのreadmeを読んで、「facebookから得た情報はauth.info.〇〇で表現できる。」などを理解する必要がある。
前提条件が違うため、コピペでは動かない。
自分のコピーしようとしているコードを1行づつ理解し、実装することが大切。