我的移动应用程序当前使用以下步骤执行SSO
- 用户将从移动应用程序的列表中选择一个IDP,然后单击登录
- 移动应用程序将指示应用内浏览器控制并导航到SSO URL
- 如果尚未通过身份验证,IDP询问用户进行身份验证
- 用户将收到登录表单以输入其凭据
- 一旦IDP成功验证了用户,SAML断言将传递给
Web Server
Web Server
信任IDP,接受SML令牌并生成会话令牌- 移动浏览器组件接受会话令牌并与本机移动应用程序共享
- 移动应用程序使用此会话令牌调用
web server
API
由于安全原因,现在不建议在移动设备上存储会话令牌,而OIDC或JWT令牌可以存储
由于我的Web应用程序不支持生成OIDC令牌,所以我想在我的移动设备和IDP之间再添加一层AWS Cognito。现在,身份验证流将类似于(SAML用户池IdP身份验证流(
- 移动应用程序通过将用户引导到AWS托管的UI来启动登录过程
- 用户被重定向到身份提供程序
- 如有必要,IdP会对用户进行身份验证。如果IdP识别出用户具有活动会话,则IdP跳过身份验证以提供单点登录(SSO(体验
- IdP将SAML断言发布到AmazonCognito服务
- 在验证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有许多开源库可以帮助您做到这一点。