実現したいこと
現在railsでツイッタークローンアプリを作成しております。
こちらの記事を参考にDeviseとOmniauthを使って、RailsアプリにGoogleログイン機能を実装しました。
sign_inのviewファイルからgoogleログインをすると、記憶されているためか自動的にアプリケーションにサインインされます。(uidの記憶?)
ポートフォリオとして作成しているため、googleログインを押下した際に、毎度下記の図のようにどのアカウントでログインするのか、という画面を挟んで毎度認証させるようにしたいです。
該当コード
OmniauthCallbacksController
1class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 2 3 def google_oauth2 4 callback_for(:google) 5 end 6 7 # common callback method 8 def callback_for(provider) 9 @user = User.from_omniauth(request.env["omniauth.auth"]) 10 if @user.persisted? 11 sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated 12 set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format? 13 else 14 session["devise.#{provider}_data"] = request.env["omniauth.auth"].except("extra") 15 redirect_to new_user_registration_url 16 end 17 end 18 19 def failure 20 redirect_to root_path 21 end
UserModel
1# omniauthのコールバック時に呼ばれるメソッド 2 def self.from_omniauth(auth) 3 where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 4 user.email = auth.info.email 5 user.password = Devise.friendly_token[0,20] 6 end 7 end
DeviseRb
1config.omniauth :google_oauth2,ENV['GOOGLE_CLIENT_ID'],ENV['GOOGLE_CLIENT_SECRET']#, scope: 'email', redirect_uri: "#{ENV['HOST']}/users/auth/google_oauth2/callback" 2 OmniAuth.config.logger = Rails.logger if Rails.env.development?
ログインの際は以下link_toで遷移させています。
<p><%= link_to "Sign in with Google", user_google_oauth2_omniauth_authorize_path, method: :post %></p>
最後に
rails consoleでuidの値をnilにしてみたりしたのですが、Sign in with Googleを押下するとnew_registration_pathに飛ばされるようになりました。
おそらくコントローラのelse文が走っているのかと考えています。
cookieを削除しても特に変化は見られませんでした。(仮にうまくいっても運用上扱いづらいですよね)
お力添えいただけるとありがたいです。
何卒よろしくお願いいたします。
※足りない点などあれば修正依頼等いただければと思います!
あなたの回答
tips
プレビュー