Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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.あとがき

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

 

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away