DeviseとOmniAuthで複数のSNSを利用して認証する
DeviseとOmniAuthで複数のSNSを利用して認証する機能を開発した時のメモ。
全体の流れ
参考リンク
- OmniAuth with multiple models
- [Devise How-To] OmniAuth認証を複数のモデルで共用する方法(翻訳)
ポイント
- Userモデルから:omniauthable引数を削除する(ここに気づかずにはまった)
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