我刚开始使用Amazon Cognito,并且想将其用于我的Web应用程序。我想开发一个无状态应用程序,在该应用程序中,我使用Cognito进行注册/登录,然后在其余请求中使用JWT令牌。
我已经使用amazon-cognito-identity-js
包在Node.js中实现了注册和登录流程,然后使用JWT令牌通过aws-sdk
调用了lambda函数。到这里为止一切都按预期进行。
但是现在问题出在不同的用户操作上,例如get attribute
,verify attribute
,update password
等,如所列@
https://docs.aws.amazon.com/cognito/latest/developerguide/using-amazon-cognito-user-identity-pools-javascript-examples.html
所有这些操作都需要cognitoUser
对象,并且它们在文档中使用userPool.getCurrentUser();
表达式。
我在某处读到该方法返回了最后一个经过身份验证的用户。因此,我认为此表达式userPool.getCurrentUser();
会引起冲突。例如,如果UserB在UserA之后登录,而UserA尝试更新其密码,则它将不起作用。
有人可以建议我什么可能的解决方案吗?
cognitoUser
对象吗?
[此解决方案打破了我的无状态要求,我将不得不在服务器端维护会话。] 请提出您是否可以想到在网络应用中实施Cognito的其他更好方法。
谢谢。
答案 0 :(得分:1)
我们有一个使用cognito和lambda的无状态应用程序。
设置方法不是直接调用lambda,而是使用Api Gateway和lambda-proxy集成。
如果您直接从前端代码调用lambda,并且正在使用认知令牌进行身份验证,那么您需要在每个lambda中放入很多逻辑来验证令牌,例如下载相关密钥,检查jwt,时间戳,颁发者等的签名。如果使用API网关,则只需create a cognito authorizer并将其放在lambda前面即可。
我们在进行api调用时传递id_token,然后该调用由授权者验证,并且lambda接收用户池中设置的所有当前属性。这意味着我们不需要额外调用即可获取属性。
要更改用户密码,可以在应用程序的前端通过调用cognito api with the access_token(如果您在用户池客户端设置中允许的话)进行操作。