gpt4 book ai didi

ruby-on-rails - 删除用户帐户后如何重置 omniauth-google-oauth2 access_token

转载 作者:行者123 更新时间:2023-12-04 06:13:12 25 4
gpt4 key购买 nike

我们有这个 ROR 应用程序,它使用 omniauth-google-oauth2devise 来登录用户。我们遇到了一个问题,如果在用户已经从他的谷歌帐户授予对应用程序的访问权限后,用户的帐户已从系统中删除,则身份验证只会进入无休止的身份验证循环。

场景是这样的:

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

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

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

最佳答案

可以覆盖 sign_in url 中的 approval_prompt,因此您可以将其设置为“force”,从而使用户脱离 catch-22,即使 google_oauth2 设计配置已将其设置为“auto”(默认)。

诀窍是传达这是 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 登录的 View 中,有条件地附加 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 帐户,则用户将有机会在再次尝试登录时切换帐户(因为他们会通过强制批准工作流程发送)。

关于ruby-on-rails - 删除用户帐户后如何重置 omniauth-google-oauth2 access_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14641759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com