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



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

  1. 用户将从移动应用程序的列表中选择一个IDP,然后单击登录
  2. 移动应用程序将指示应用内浏览器控制并导航到SSO URL
  3. 如果尚未通过身份验证,IDP询问用户进行身份验证
  4. 用户将收到登录表单以输入其凭据
  5. 一旦IDP成功验证了用户,SAML断言将传递给Web Server
  6. Web Server信任IDP,接受SML令牌并生成会话令牌
  7. 移动浏览器组件接受会话令牌并与本机移动应用程序共享
  8. 移动应用程序使用此会话令牌调用web serverAPI

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

由于我的Web应用程序不支持生成OIDC令牌,所以我想在我的移动设备和IDP之间再添加一层AWS Cognito。现在,身份验证流将类似于(SAML用户池IdP身份验证流(

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

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

更新:我能够从Cognito发布的web服务器验证JWT令牌。如果其他人也希望这样做,那么他们可以参考这个cognitojwt库(不是我写的,只是在互联网上找到的(

Cognito返回的OIDC令牌为ID令牌和Access令牌,均为JWT。您可以将这些直接传递到自定义后端(最常见的是在Authorization标头中(。

在后端,您应该使用用户池的公钥(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有许多开源库可以帮助您做到这一点。

最新更新