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
函数从每个查询中获取作者?