我将 AppSync
与 IAM auth
以及 DynamoDB 解析器
和 Cognito
结合使用。我正在尝试执行以下操作。
{
"version": "2017-02-28",
"operation": "GetItem",
"key": {
"userId": $util.dynamodb.toDynamoDBJson($ctx.identity.username)
}
}
$ctx.identity.username
应该包含由 Cognito
生成的 userId
,我正在尝试使用它来获取当前用户数据。
客户端,我使用 AWS Amplify
来告诉我当前已登录:
this.amplifyService.authStateChange$.subscribe(authState => {
if (authState.state === 'signedIn') {
this.getUserLogged().toPromise();
this._isAuthenticated.next(true);
}
});
getUserLogged
是应该返回用户数据的 Apollo 查询
。
我尝试过的:
- 如果我像这样保留它,
getUserLogged
将返回 null。 - 如果我在解析器中将
$util.dynamodb.toDynamoDBJson($ctx.identity.username)
替换为已知的userId
,如下所示$util.dynamodb .toDynamoDBJson("b1ad0902-2b70-4abd-9acf-e85b62d06fa8")
:它有效!我获取了这些用户数据。 - 我尝试在解析器页面中使用测试工具,但它只提供虚假数据,因此我不能依赖它。
我是不是搞错了?对我来说一切看起来都不错,但我想我错过了一些东西?
我可以清楚地看到$ctx.identity
包含什么吗?
最佳答案
您需要使用 $ctx.identity.cognitoIdentityId
来识别 Cognito IAM 用户:
https://docs.aws.amazon.com/appsync/latest/devguide/resolver-context-reference.html#aws-appsync-resolver-context-reference-identity
您可以通过创建 Lambda 解析器并记录事件或通过创建本地解析器并返回映射模板收到的输入来查看 $ctx.identity
的内容:
https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-local-resolvers.html
我的 cognitoIdentityId
如下所示:eu-west-1:27ca1e79-a238-4085-9099-9f1570cd5fcf
关于amazon-dynamodb - 带有 ctx.identity.username 的简单 GetItem 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51230159/