rails Twitter/google認証

# 参考サイト
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/

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

```ruby
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

```

```ruby: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
```

```ruby: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
```

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

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

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

```ruby:app/controllers/users/registrations_controller
class Users::RegistrationsController < Devise::RegistrationsController
  def build_resource(hash={})
    hash[:uid] = User.create_unique_string
    super
  end
end
```

```ruby:app/models/user.rb
def self.create_unique_string
  SecureRandom.uuid
end
```

```ruby: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
```

```ruby: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
```