如果在两者之间添加 AWS Cognito,移动应用程序和 Web 服务器如何通信
How mobile app and web server communicates if AWS Cognito is added in between
我的移动应用程序当前使用以下步骤执行 SSO
- 用户将 select 移动应用程序列表中的 IDP 之一,然后单击登录
- 移动应用程序将加强应用程序内浏览器控制并导航到 SSO URL
- 如果尚未通过身份验证,IDP 会向用户质询身份验证
- 用户将看到登录表单以输入 his/her 凭据。
- 一旦用户通过 IDP 成功验证,SAML 断言将传递给
Web Server
Web Server
信任 IDP,接受 SML 令牌并生成会话令牌
- 移动浏览器组件接受会话令牌并与本机移动应用共享它
- 移动应用使用此会话令牌调用
web server
API 次
现在出于安全原因,不建议将会话令牌存储在移动设备上,而可以存储 OIDC 或 JWT 令牌
由于我的 Web 应用程序不支持生成 OIDC 令牌,因此我考虑在我的移动设备和 IDP 之间再添加一层 AWS Cognito。现在身份验证流程将类似于 (SAML User Pool IdP Authentication flow)
- 移动应用程序通过将用户定向到 AWS 托管的 UI 来启动登录过程。
- 用户被重定向到身份提供者。
- IdP 在必要时对用户进行身份验证。如果 IdP 识别出用户有活动会话,IdP 将跳过身份验证以提供单点登录 (SSO) 体验。
- IdP 将 SAML 断言发布到 Amazon Cognito 服务。
- 验证 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 并且有许多开源库可以帮助您做到这一点。
我的移动应用程序当前使用以下步骤执行 SSO
- 用户将 select 移动应用程序列表中的 IDP 之一,然后单击登录
- 移动应用程序将加强应用程序内浏览器控制并导航到 SSO URL
- 如果尚未通过身份验证,IDP 会向用户质询身份验证
- 用户将看到登录表单以输入 his/her 凭据。
- 一旦用户通过 IDP 成功验证,SAML 断言将传递给
Web Server
Web Server
信任 IDP,接受 SML 令牌并生成会话令牌- 移动浏览器组件接受会话令牌并与本机移动应用共享它
- 移动应用使用此会话令牌调用
web server
API 次
现在出于安全原因,不建议将会话令牌存储在移动设备上,而可以存储 OIDC 或 JWT 令牌
由于我的 Web 应用程序不支持生成 OIDC 令牌,因此我考虑在我的移动设备和 IDP 之间再添加一层 AWS Cognito。现在身份验证流程将类似于 (SAML User Pool IdP Authentication flow)
- 移动应用程序通过将用户定向到 AWS 托管的 UI 来启动登录过程。
- 用户被重定向到身份提供者。
- IdP 在必要时对用户进行身份验证。如果 IdP 识别出用户有活动会话,IdP 将跳过身份验证以提供单点登录 (SSO) 体验。
- IdP 将 SAML 断言发布到 Amazon Cognito 服务。
- 验证 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 并且有许多开源库可以帮助您做到这一点。