LoginSignup
3
2

More than 3 years have passed since last update.

rails Twitter/google認証

Last updated at Posted at 2019-05-13

参考サイト

https://qiita.com/kenzoukenzou104809/items/7995cd8796c6181b6c95
https://qiita.com/kami_zh/items/94aec2d94a2b4e9a1d0b#devise%E3%81%AE%E5%90%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%94%9F%E6%88%90
https://qiita.com/bino98/items/596b5cffeca7c104bd90

これ基本使って、あとは、新規登録時のuidをデフォルトで入力するやつをやる。
あと、devise側でnameのStrong Parameterの設定と、adminを追加する。
https://kenzooooo.com/programming/rails-omniauth-google-twitter

ツイートのボタンを表示
https://whatsupguys.net/programming-school-dive-into-code-learning-71/

基本このやり方。
あとは、カラムを追加する感じ。

class AddColumnsToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :uid, :string, null:false, default:""
    add_column :users, :provider, :string, null:false, default:""
    add_column :users, :name, :string, null:false, default:""
    add_column :users, :image_url, :string, null:false, default:""
    add_index :users, [:uid, :provider], unique: true
    add_column :users, :token, :string
    add_column :users, :meta, :string
  end
end

user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :trackable, :omniauthable, omniauth_providers: %i(google twitter)

  def self.create_unique_string
    SecureRandom.uuid
  end

  protected

  def self.find_for_oauth(auth)
    user = User.where(uid: auth.uid, provider: auth.provider).first

    unless user
      user = User.create(name: auth.info.name,
                         email: User.dumy_email(auth),
                         provider: auth.provider,
                         uid: auth.uid,
                         password: Devise.friendly_token[0, 20],
                         image_url: auth.info.image,
                         token:    auth.credentials.token,
                         meta:     auth.to_yaml
                         )
    end
    user
  end

  private

  def self.dumy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com" #POINT
  end
end
app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def twitter
    callback_from :twitter
  end

  def google
    callback_from :google
  end 

  def callback_from(provider)
    provider = provider.to_s
    @user = User.find_for_oauth(request.env['omniauth.auth'])

    if @user.persisted?
      flash[:notice] = I18n.t 'devise.omniauth_callbacks.success', kind: provider.capitalize
      sign_in_and_redirect @user, event: :authentication
      session[:user_id] = @user.id #add
    else
      session['devise.#{provider}_data'] = request.env['omniauth.auth']
      redirect_to new_user_registration_url
    end
  end
end

通常の新規登録も併用して実装する時の注意点

users/registration_controllerを作成して、deviseのコントローラーを継承する
$ rails g controller users::registrations

uidにランダムなuidを代入しています。 また、superメソッドを使用して、もとのメソッドに記述されていたものを、そのまま代入しています。

app/controllers/users/registrations_controller
class Users::RegistrationsController < Devise::RegistrationsController
  def build_resource(hash={})
    hash[:uid] = User.create_unique_string
    super
  end
end
app/models/user.rb
def self.create_unique_string
  SecureRandom.uuid
end
config/routes.rb(新規登録する際、継承したregistration_controllerにアクションが起動するようにする)
Rails.application.routes.draw do
  root to: "blogs#index"
  resources :blogs

  devise_for :users, controllers: { 
    omniauth_callbacks: 'users/omniauth_callbacks',
    registrations: "users/registrations"
  }
end
application_controller(StrongParameterの設定)
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name])
  end
end
3
2
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
3
2