Amazon dynamodb 带有ctx.identity.username的简单GetItem返回null

Amazon dynamodb 带有ctx.identity.username的简单GetItem返回null,amazon-dynamodb,amazon-cognito,aws-appsync,aws-amplify,vtl,Amazon Dynamodb,Amazon Cognito,Aws Appsync,Aws Amplify,Vtl,我正在使用AppSync和IAM auth以及DynamoDB解析器和Cognito。我试着做以下几点 { “版本”:“2017-02-28”, “操作”:“GetItem”, “关键”:{ “userId”:$util.dynamodb.toDynamoDBJson($ctx.identity.username) } } $ctx.identity.username应该包含由Cognito生成的userId,我正试图使用它获取当前用户数据 客户端,我正在使用AWS Amplify,它告诉我当

我正在使用
AppSync
IAM auth
以及
DynamoDB解析器和
Cognito
。我试着做以下几点

{
“版本”:“2017-02-28”,
“操作”:“GetItem”,
“关键”:{
“userId”:$util.dynamodb.toDynamoDBJson($ctx.identity.username)
}
}
$ctx.identity.username
应该包含由
Cognito
生成的
userId
,我正试图使用它获取当前用户数据

客户端,我正在使用AWS Amplify
,它告诉我当前已登录:

this.amplicationservice.authStateChange$.subscribe(authState=>{
如果(authState.state=='signedIn'){
this.getUserLogged().toPromise();
此._已验证。下一步(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用户:

    通过创建Lambda解析器并记录事件,或创建本地解析器并返回映射模板接收的输入,可以查看
    $ctx.identity
    的内容:


    我的
    cognitoIdentityId
    看起来像这样:
    eu-west-1:27ca1e79-a238-4085-9099-9f1570cd5fcf

    好的。我可以试试,但您确定
    $ctx.identity.cognitoIdentityId
    未链接到设备吗?如果该用户带有其他设备,该怎么办。他在
    $ctx.identity.cognitoIdentityId
    中是否具有相同的值?如果他想在Twitter上登录怎么办。
    $ctx.identity.cognitoIdentityId
    中是否仍有相同的值?感谢您的帮助@mikuz。上下文参考建议使用
    cognitoIdentityId
    从Cognito创建的身份识别用户。我看不到有证据表明它与设备有关联,但你可以验证这个假设。将Twitter登录连接到用户池登录?我认为联邦身份不支持这一点。当然,您可以开发一个系统来连接两个提供商的登录(您可能需要使用Lambda解析器)。似乎
    Cognito
    触发器中没有
    cognitoIdentityId
    。我目前正在使用触发器来存储由Cognito生成的uniq用户ID。我可以在解析程序中使用的Id。我迷路了。这个答案应该可以帮助您一起使用Cognito UserPools用户和Federated Identity IAM用户,所以我必须使用
    Lambda
    函数从每个查询中获取作者?