如果在两者之间添加 AWS Cognito,移动应用程序和 Web 服务器如何通信

How mobile app and web server communicates if AWS Cognito is added in between

我的移动应用程序当前使用以下步骤执行 SSO

  1. 用户将 select 移动应用程序列表中的 IDP 之一,然后单击登录
  2. 移动应用程序将加强应用程序内浏览器控制并导航到 SSO URL
  3. 如果尚未通过身份验证,IDP 会向用户质询身份验证
  4. 用户将看到登录表单以输入 his/her 凭据。
  5. 一旦用户通过 IDP 成功验证,SAML 断言将传递给 Web Server
  6. Web Server 信任 IDP,接受 SML 令牌并生成会话令牌
  7. 移动浏览器组件接受会话令牌并与本机移动应用共享它
  8. 移动应用使用此会话令牌调用 web server API 次

现在出于安全原因,不建议将会话令牌存储在移动设备上,而可以存储 OIDC 或 JWT 令牌

由于我的 Web 应用程序不支持生成 OIDC 令牌,因此我考虑在我的移动设备和 IDP 之间再添加一层 AWS Cognito。现在身份验证流程将类似于 (SAML User Pool IdP Authentication flow)

  1. 移动应用程序通过将用户定向到 AWS 托管的 UI 来启动登录过程。
  2. 用户被重定向到身份提供者。
  3. IdP 在必要时对用户进行身份验证。如果 IdP 识别出用户有活动会话,IdP 将跳过身份验证以提供单点登录 (SSO) 体验。
  4. IdP 将 SAML 断言发布到 Amazon Cognito 服务。
  5. 验证 SAML 断言并从断言中收集用户属性(声明)后,Amazon Cognito returns OIDC 令牌到现在登录用户的移动应用程序。

现在我的问题是,一旦我拥有 OIDC 令牌,移动应用程序将如何调用我的 web server 进行任何 API 调用?是通过 Cognito 吗?直接调用我的 Web 服务器将无法正常工作,因为它不理解 Cognito 返回的 OIDC 令牌?如何实现从移动应用程序到我的 Web 服务器的通信?

更新:我能够从我的网络服务器上验证由 Cognito 发布的 JWT 令牌。如果其他人也想做同样的事情,那么他们可以参考这个 cognitojwt library(不是我写的,只是在网上找到的)

Cognito返回的OIDC token是ID Token和Access Token,都是JWT。您可以将这些直接传递到您的自定义后端(最常见于 Authorization header)。

在后端,您应该使用用户池的 public 密钥 (JWK) 解码和验证令牌。 JWK 在 https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json 有售。如果令牌有效且未过期,您可以信任它并将其用于自定义后端授权逻辑。

这里描述了验证令牌的整个过程 https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-verifying-a-jwt.html 并且有许多开源库可以帮助您做到这一点。