繁体   English   中英

如何在删除用户帐户时重置omniauth-google-oauth2 access_token

[英]How to reset omniauth-google-oauth2 access_token when user account has been removed

我们使用此RoR应用程序omniauth-google-oauth2devise在用户登录。 我们遇到的问题是,如果在用户已经从他的Google帐户授予对该应用程序的访问权限后,用户的帐户已从系统中删除,则身份验证只会进行无限循环的身份验证。

场景如下:

  1. 用户通过谷歌进行身份验证并授予应用程序访问权限
  2. 在回调中,我们的应用程序确定用户帐户是否有效 - 已删除或未创建(我们的系统不支持自助服务注册)
  3. 用户未经授权(未登录),这是正确的)
  4. 如果用户再次尝试通过Google登录,尝试使用其他帐户,Google会透明地授权并将用户重定向回我们的应用程序,而不会让用户有机会更改帐户。

用户实际上可以通过先退出来退出此循环。 但这对普通用户来说并不是很明显,因此不是一个理想的解决方案。

理想情况下,解决方案是在回调阶段使access_token无效或撤消应用程序授权,以便当用户再次尝试登录时,他们可以切换帐户。

可以覆盖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帐户,则用户在尝试重新登录时将有机会切换帐户(因为他们将通过强制批准工作流程)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM