使用AWS.config.credentials的Amazon AWS getAttribute()

时间:2018-08-10 21:26:05

标签: amazon-web-services amazon-cognito

我刚开始使用Amazon Cognito,并且想将其用于我的Web应用程序。我想开发一个无状态应用程序,在该应用程序中,我使用Cognito进行注册/登录,然后在其余请求中使用JWT令牌。

我已经使用amazon-cognito-identity-js包在Node.js中实现了注册和登录流程,然后使用JWT令牌通过aws-sdk调用了lambda函数。到这里为止一切都按预期进行。

但是现在问题出在不同的用户操作上,例如get attributeverify attributeupdate 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尝试更新其密码,则它将不起作用。

有人可以建议我什么可能的解决方案吗?

  1. 我应该在服务器端的会话中存储cognitoUser对象吗? [此解决方案打破了我的无状态要求,我将不得不在服务器端维护会话。]
  2. 是否可以使用JWT令牌执行这些操作?

请提出您是否可以想到在网络应用中实施Cognito的其他更好方法。

谢谢。

1 个答案:

答案 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(如果您在用户池客户端设置中允许的话)进行操作。