首页 > 解决方案 > 使用外部身份提供商静默登录 AWS Cognito

问题描述

我们使用 AWS Cognito 作为 AWS Amplify 随附的用户管理平台,用于我们的新项目。但我们也有 KeyCloak 作为组织的 SSO。因此,我们通过 OIDC 将 KeyCloak 作为外部 IdP 连接到 Cognito,以允许用户使用组织的 SSO 登录到我们的新系统。

我们试图实现的是当用户已经通过组织的 SSO 登录时。当他们无缝访问这个新站点时,他们应该处于登录状态。

但是,Auth.currentSession()仅识别来自 Cognito 的登录会话,这意味着它不会识别用户已经登录到其他网站上的 KeyCloak。我提出的解决方案是尝试使用silentLoginfrom oidc-client来检查用户访问时的登录状态。静默登录运行 iframe 以向身份验证链接发送请求。它首先将请求发送到https://xxxxx.auth.ap-southeast-2.amazoncognito.com/oauth2/authorizeprompt=none避免显示 UI。但是当请求被重定向到 KeyCloak 时,它不会发送prompt=nonewhich 使它尝试加载登录 UI 并导致silentLogin失败。

所以我想知道是否有任何方法可以编辑从 Cognito 到 KeyCloak 的重定向 url。或者可以提出任何实现我的目标的解决方案。

谢谢

标签: amazon-cognitoopenid-connectaws-amplify

解决方案


预期的行为应该是这样的——一些 UX 利益相关者可能不喜欢第二次重定向或认为它是无缝的,但它必须像这样发生:

  • 用户通过 App A 登录并在浏览器中有 Keycloak IDP cookie
  • 导航到 App B 会导致通过 Cognito 到 Keycloak 的顶级重定向,但由于 IDP cookie 没有身份验证提示。另请注意,这仅在存在用作用户手势的顶级浏览器重定向时才有效。

避免使用 prompt=none 技术,该技术现在已被弃用:

  • 您将无法将消息从 Cognito 更改为 Keycloak,因为标准不允许这样做
  • Cognito 从未支持 prompt=none
  • Safari 浏览器将丢弃此类请求的 SSO cookie

相反,我会仔细查看 App B 重定向的 HTTP 消息:

  • 是否发送了 Keycloak IDP cookie(在几个浏览器上进行测试并查看丢弃 cookie 的原因)
  • 如果发送了 cookie,那么消息中是否有任何内容,例如 prompt=login 或可能需要每个应用程序进行身份验证的 Keycloak 会话设置?

推荐阅读