DeviseとOmniAuthで複数のSNSを利用して認証する

DeviseとOmniAuthで複数のSNSを利用して認証する機能を開発した時のメモ。

全体の流れ

参考リンク

Controller周り

参考リンク

Model周り

omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV['TWITTER_KEY'], ENV['TWITTER_SECRET']
end
get '/auth/:action/callback', controller: 'authentications', constraints: { action: /twitter/ }

app/controllers/authentications_controller.rb

class AuthenticationsController < ApplicationController
  auth = request.env['omniauth.auth']
end

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview#facebook-example https://github.com/omniauth/omniauth/wiki/Managing-Multiple-Providers

$ rails g model Authentications user:references provider uid access_token access_secret
class CreateAuthentications < ActiveRecord::Migration[5.0]
  def change
    create_table :authentications do |t|
      t.references :user, foreign_key: true, null: false
      t.string :provider, null: false
      t.string :uid, null: false
      t.string :access_token
      t.string :access_secret

      t.timestamps
    end

    add_index :authentications, [:provider, :uid], unique: true
  end
end

authentication.rb

class Authentication < ApplicationRecord
  belongs_to :user

  validates :user_id, presence: true
  validates :provider, presence: true
  validates :uid, presence: true, uniqueness: { scope: :provider }
end

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview#facebook-example

参考

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview https://github.com/plataformatec/devise/wiki/OmniAuth-with-multiple-models https://techracho.bpsinc.jp/hachi8833/2017_05_18/40208 https://github.com/omniauth/omniauth/wiki/Managing-Multiple-Providers https://qiita.com/awakia/items/03dd68dea5f15dc46c15 http://sinsoku.hatenablog.com/entry/2016/01/03/090000 https://qiita.com/kami_zh/items/94aec2d94a2b4e9a1d0b