ブログを更新しました。元の記事はコチラ
RailsでFacebookログインを実装する
これを実装する度に毎回Railscastsを確認しているので、いい加減自分でまとめておきます。
###準備
omniauth-facebook
https://developers.facebook.com でアプリをつくる。
赤い四角の所は必須だと思います。+Add Platform ウェブサイトの入力欄もつくります。
Gemfile
gem 'omniauth-facebook'
config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET']
end
FACEBOOK_KEYとFACEBOOK_SECRETは環境変数なので、
CentOSとかの場合は ~/.bash_profile なんかを編集、
herokuの場合はheroku config:set FACEBOOK_KEY=0123456789
などとして設定しておいてください。
###ルーティングの設定
failureは、なんらかの原因でログインが失敗した時に、表示させるページ。
ログインボタンのリンクは/auth/facebook
です。
get '/auth/:provider/callback', to: 'users#create', as: :auth_callback
get '/auth/failure', to: 'users#auth_failure', as: :auth_failure
###コントローラー
Facebookから返ってくる情報を使って、ユーザーを作成したり、ログインさせたりします。
ログインの度に、iconや名前を更新したいので、@user.saveしています。
sign_inメソッドについては説明しませんが、current_userに該当のuserを代入しているだけです。
from_omniauth
メソッドやcontext: :facebook_login
についてはモデルにて。
env['omniauth.auth']にいろいろ情報が入っているので、引数として渡しています。
controllers/users_controller.rb
def create
if env['omniauth.auth'].present?
# Facebookログイン
@user = User.from_omniauth(env['omniauth.auth'])
result = @user.save(context: :facebook_login)
fb = "Facebook"
else
# 通常サインアップ
@user = User.new(strong_params)
result = @user.save
fb = ""
end
if result
sign_in @user
flash[:success] = "#{fb}ログインしました。"
redirect_to @user
else
if fb.present?
redirect_to auth_failure_path
else
render 'new'
end
end
end
###モデル
同じメールアドレスが見つかれば、そのユーザーとしてログイン。
そうでなければ、新しくユーザーを作成します。
Facebookログインでは、パスワードが必要ありませんので、パスワードのバリデーションを無効にしています。
on: :facebook_login
を加えておいて、コントローラーでセーブする際に@user.save(context: :facebook_login)
としています。
models/user.rb
validates :password, presence: false, on: :facebook_login
def self.from_omniauth(auth)
# emailの提供は必須とする
user = User.where('email = ?', auth.info.email).first
if user.blank?
user = User.new
end
user.uid = auth.uid
user.name = auth.info.name
user.email = auth.info.email
user.icon = auth.info.image
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
user
end
/auth/facebook を叩けば、Facebookのダイアログが表示されるはず。
以上か、な…?
なんかまとめ忘れている気もしなくもないが。。