AWS Cognito - 如何在使用 Google 登录时强制选择帐户

jue*_*eno 17 authentication amazon-web-services oauth-2.0 google-oauth amazon-cognito

我目前正在使用与 Google 联合作为身份提供商的 Cognito 用户池来处理用户登录我的网络应用程序。目前,我只实现了使用 Google 登录。这目前正在通过 Cognito 的托管 UI 完成。

当用户使用 Google 登录时,我希望始终提示他们选择他们的帐户,即显示此提示

但是,我发现当我仅使用一个 Google 帐户登录时,会跳过此屏幕。虽然,当我没有登录 Google 帐户/2 个或更多 Google 帐户时,会显示此屏幕。

我试图让这个屏幕总是出现的事情:

  1. 使用 AWS Amplify 的federatedSignIn({provider: 'Google'})功能。然而,我发现,这只是对Cognito的托管UI,只是重定向到相同的授权端点的包装,如所描述这里
  2. 添加prompt=select_accountGoogle 文档中详述的授权端点,但这没有任何效果。这并不奇怪,因为授权端点promptAWS 文档中没有详细说明该选项。

如果有人对我如何始终显示此帐户选择屏幕有任何想法,将不胜感激。

Loc*_*Guy 17

事实证明,此时(2020 年 1 月)(编辑:请参阅下文以了解他们提出的仍然存在问题的解决方案)AWS Cognito 不支持prompt=select_account(或promptGoogle 提供的任何选项)。在他们的支持下来回走动,以下是他们当前行动计划的最终结果信息:

(重申问题) Auth.signOut() 仅从 Cognito 注销,而不是从联合提供商(在您的情况下为 Google)注销。因此,当您再次尝试登录时(在您的客户情况下,使用Auth.federatedSignIn({ .provider: 'Google' }))它会自动绕过 Google 的帐户选择/登录并直接使用现有会话。[如果是错误的 Google 会话,这可能是一个问题]

对此的一个次优解决方案是同时退出 Google。您可以通过向https://accounts.google.com/logout发出 GET 请求来完成此操作。这样,后续federatedSignIn将需要通过 Google 登录屏幕。

我已将此案例上报给西雅图的 Cognito 服务团队以获取功能请求:

能够prompt="select_account"通过 URL 查询将选项传递给 Google。

编辑以添加 Cognito 响应:

如果您使用的是 Cognito 托管 UI,则可以通过调用以下端点来清理 Cognito 用户池会话:

    https://<Your-User-Pool-Domain>.auth.<Your-User-Pool-Region>.amazoncognito.com/logout?client_id=<Your-User-Pool-App-Client>&logout_uri=<Your-User-Pool-SignOut-URL>
Run Code Online (Sandbox Code Playgroud)

当我 (AWS Congito) 尝试使用 Cognito Hosted UI 重现该问题时,我必须在退出后重新登录 Google。我无法以一种或另一种方式重现这个问题。

有关更多信息和各种选项,请参阅Cognito 文档以获取注销链接

编辑以添加更多信息:不幸的是,此修复程序(使用注销链接)无法按预期工作。它确实让用户选择一个新的身份提供商(谷歌、Facebook 等),但如果用户使用他们选择的身份登录,那么它会继续使用该用户身份,而不是让用户在其中进行选择多个帐户或使用新帐户登录。

  • 我一度以为我要疯了。谢谢你让我恢复了理智。“门票”可以公开查看吗?你能分享一下链接吗? (2认同)
  • 经过一番挖掘,我发现联合登录后,Cognito cookie 存储在托管 UI 域中。在浏览器中手动清除该 cookie 后,您可以再次选择不同的帐户。但是,清除它的唯一方法是使用 LOGOUT 端点。这意味着除了在浏览器中显示托管 UI 之外,没有其他方法可以清除它。该 cookie 驻留在您提供的托管 UI 子域中,无法被其他子域清除。 (2认同)
  • 有什么办法解决这个问题吗?我面临着同样的问题。 (2认同)