我们有这个ROR应用程序使用omniauth-google-oauth2
和devise
来登录用户。我们遇到的问题是,如果用户已经从用户的谷歌帐户授予对该应用程序的访问权限后用户的帐户已从系统中删除,则身份验证只会进行无限循环的身份验证。
场景如下:
用户实际上可以通过先退出来退出此循环。但这对普通用户来说并不是那么明显,因此不是理想的解决方案。
理想情况下,解决方案是在回调阶段使access_token无效或撤销应用程序授权,以便当用户再次尝试登录时,他们可以切换帐户。
答案 0 :(得分:1)
可以覆盖sign_in网址中的approval_prompt,因此您可以将其设置为“强制”,从而让用户退出catch-22,即使google_oauth2设计配置已将其设置为“自动”(默认值)。
诀窍是在OmniauthCallbacksController中传达这是需要的。一种简单而不显眼的方法是简单地设置一个临时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帐户,则用户在尝试重新登录时将有机会切换帐户(因为他们会通过强制批准工作流程发送。)