LoginSignup
11
8

More than 5 years have passed since last update.

【ruby on rails】Facebookでログインする方法【Deviseなし】

Posted at

0.前書き

Qiita初投稿です。
railsでfacebookログインを実装したため、備忘録として。

1.前提

・Facebook for Developers側の準備が完了している
・Deviceは使用しない
・Userモデルを作成している

2.gemをインストール

まずは以下をGemfileに追加し、bundle installを実行。

Gemfile
gem 'omniauth'
gem 'omniauth-facebook'
$bundle install

3.ルーティングを追加

続いて、ルーティングを2つ設定します。
1つ目は、ログインに成功した際のURL、
2つ目は、ログインに失敗した際のURLです。

route.rb
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

作成したマイグレーションファイルを編集します。

マイグレーションファイル.rb
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などで情報を取得し、ユーザー情報として使用する。

User.rb
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メソッドは別で作成してください。

users_controller.rb
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でログインできます。

login.html.rb
<%= link_to "Facebookでログイン", "/auth/facebook" %>

8.あとがき

いかがでしたでしょうか。
一応これで実装できましたが、なんだか不要なことをしているようにも思います。
もっと精進したい。

 

11
8
0

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
11
8