##0.前書き
Qiita初投稿です。
railsでfacebookログインを実装したため、備忘録として。
##1.前提
・Facebook for Developers側の準備が完了している
・Deviceは使用しない
・Userモデルを作成している
##2.gemをインストール
まずは以下をGemfileに追加し、bundle installを実行。
gem 'omniauth'
gem 'omniauth-facebook'
$bundle install
##3.ルーティングを追加
続いて、ルーティングを2つ設定します。
1つ目は、ログインに成功した際のURL、
2つ目は、ログインに失敗した際のURLです。
get '/auth/:provider/callback', to: 'users#facebook_login', as: :auth_callback
get '/auth/failure', to: 'users#auth_failure', as: :auth_failure
##4.Userモデルにカラムを追加
いくつか追加でカラムが必要になるようなので、マイグレーションファイルを作成します。
$rails generate migration AddColumnsToUser
作成したマイグレーションファイルを編集します。
class AddColumnToUser < ActiveRecord::Migration[5.1]
def change
add_column :users, :uid, :string
add_column :users, :oauth_token, :string
add_column :users, :oauth_expires_at, :string
end
end
忘れずにマイグレーションを行います。
$rails db:migrate
##5.モデルにメソッドを作成
from_ominiauthという名前でメソッドを定義します。
auth.info.〇〇でfacebookから情報を取得できるので、活用していきます。
大まかな処理の流れは次の通り。
①on: :facebook_loginでパスワードのバリデーションを無視する
②auth.info.emailでfacebookに登録されているemail情報を取得し、Userテーブルから一致するユーザーを探す。
③auth.info.uid、auth.info.name、auth.info.emailなどで情報を取得し、ユーザー情報として使用する。
validates :password, presence: true, length: {minimum: 8}, on: :facebook_login
def self.from_omniauth(auth)
user = User.where('email = ?', auth.info.email).first
if user.blank?
user = User.new
end
user.uid = auth.uid
user.username = auth.info.name
user.email = auth.info.email
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user
end
##6.コントローラーを作成
先ほど作成したメソッドをUsersコントローラーで使用します。
log_inメソッドは別で作成してください。
def facebook_login
@user = User.from_omniauth(request.env["omniauth.auth"])
result = @user.save(context: :facebook_login)
if result
log_in @user
redirect_to @user
else
redirect_to auth_failure_path
end
end
#認証に失敗した際の処理
def auth_failure
@user = User.new
render '任意のアクション'
end
##7.ビューを作成
/auth/facebookを叩くと、Facebookでログインできます。
<%= link_to "Facebookでログイン", "/auth/facebook" %>
##8.あとがき
いかがでしたでしょうか。
一応これで実装できましたが、なんだか不要なことをしているようにも思います。
もっと精進したい。