69
64

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RailsでFacebookログインを実装する

Posted at

ブログを更新しました。元の記事はコチラ


RailsでFacebookログインを実装する

これを実装する度に毎回Railscastsを確認しているので、いい加減自分でまとめておきます。

###準備
omniauth-facebook

https://developers.facebook.com でアプリをつくる。
赤い四角の所は必須だと思います。+Add Platform ウェブサイトの入力欄もつくります。
facebook-app

  

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のダイアログが表示されるはず。

以上か、な…?
なんかまとめ忘れている気もしなくもないが。。

http://workabroad.jp/posts/2099

69
64
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
64

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?