sign_in URLのapproval_promptをオーバーライドできるため、google_oauth2デバイス構成で「auto」(デフォルト)に設定されている場合でも、「force」に設定して、ユーザーをcatch-22から外すことができます。
秘訣は、これがOmniauthCallbacksController内から必要なものであることを伝えることです。シンプルで目立たない方法の1つは、一時的なCookieを設定することです。
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def google_oauth2
if user = User.find_for_google_oauth2(request.env["omniauth.auth"])
cookies.delete :google_oauth2_approval_prompt
flash[:notice] = I18n.t( "devise.omniauth_callbacks.success", kind: "Google")
sign_in_and_redirect user, event: :authentication
else
# we are not supporting self-service registration, so although
# user has authenticated at Google and given consent to the app,
# we are not going to allow the user in
cookies[:google_oauth2_approval_prompt] = "force"
flash[:error] = I18n.t( "devise.omniauth_callbacks.failure", kind: "Google", reason: "account not provisioned")
redirect_to root_url
end
end
end
次に、Googleログインをレンダリングするビューで、条件付きでapproval_promptを追加します。
:ruby
extra_params = if approval_prompt = cookies[:google_oauth2_approval_prompt]
{approval_prompt: approval_prompt}
else
{}
end
= link_to "Sign-in with Google",
user_omniauth_authorize_path(:google_oauth2,extra_params)
したがって、これらすべてが整った状態で、ユーザーが最初にGoogleアカウントを使用して、アプリケーションが受け入れないと判断した場合、ユーザーは再度ログインしようとしたときにアカウントを切り替えることができます(アカウントは経由で送信されるため)強制承認ワークフロー)。