人生68日目

HAGIRE(n)

devise+omniauthを使用してtwitterログインを実装した。

学び

device gem使用時、ユーザー情報の更新に現在のパスワード(current_password)を使用しないように設定する。
Twitterログインと通常の認証をユーザーが選択する場合、Twitterログインを選択した場合アプリ側のパスワード属性に「Devise.friendly_token[0, 20]」として、ランダム生成されたパスワードを使用するため、ユーザーはデータベースに登録してあるパスワードがわからないので、こういった設定が必要になる場合がある。
以下のようにする。

①「registrations_controller.rb」を作成する

#registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  
  protected

  def update_resource(resource, params)
    resource.update_without_password(params)
  end
end

rails g controllerで作成すると、単にApplicationControllerを継承したコントローラーが生成されるが、devise側のcontrollerをオーバーライドしたいので、Devise::RegistrationsControllerを継承するようにする。

②routes.rbを変更

#routes.rb
Rails.application.routes.draw do

  devise_for :users, controllers:  {  registrations: 'registrations' }
.
.
.
end

omniauthを使っている場合はdevise_for :users, controllers: { omniauth_callbacks: ’users/omniauth_callbacks’, registrations: 'registrations' }とする。

③user editページのformにあるcurrent_passwordの部分を消す。 パスワードを用いないように設定しているため、残っているとエラーがでる。
また、formをデフォルトのまま使っている場合、新しいパスワードを設定するフォームがあると思うが、そちらもTwitterログインを使用しているユーザーには不要なので<% if current_user.provider.nil? %>などの条件文で表示されないようにする。
適当なユーザーで確認してみるとわかりやすいが、omniauthを使ってFacebookなりTwitterなりでログインするとプロバイダ名が入るようになっている。
ここは本当はTwitterログイン⇨ユーザーedieページへ移動⇨メールアドレスを登録してもらうという流れが一番いいんだろうけど、カジュアルに使って欲しい(ネタで作ったWebアプリなので)ので、メールアドレスには取り合えずランダム生成したものを登録するようにしている。

コード書いてると常に思うけど、こんなQiita読んだりしてコピペして、例外が出たらコードを読み込んで自分の環境に合わせるような書き方でいいのだろうか・・・。