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

Posted

技术标签:

【中文标题】带有 ctx.identity.username 的简单 GetItem 返回 null【英文标题】:Simple GetItem with ctx.identity.username returns null 【发布时间】:2018-12-16 05:30:19 【问题描述】:

我将AppSyncIAM authDynamoDB resolverCognito 一起使用。我正在尝试执行以下操作。


    "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 query

我尝试过的:

如果我这样保留,getUserLogged 将返回 null。 如果我将解析器中的$util.dynamodb.toDynamoDBJson($ctx.identity.username) 替换为已知的userId,就像这样$util.dynamodb.toDynamoDBJson("b1ad0902-2b70-4abd-9acf-e85b62d06fa8"):它可以工作!我得到了这个用户数据。 我尝试使用解析器页面中的测试工具,但它只提供虚假数据,因此我不能依赖它。

我做错了吗?在我看来一切都很好,但我想我错过了什么?

我可以清楚地看到$ctx.identity 包含的内容吗?

【问题讨论】:

【参考方案1】:

您需要使用 $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

【讨论】:

好的。我可以试试,但你确定$ctx.identity.cognitoIdentityId 没有链接到设备吗?如果该用户带有另一台设备怎么办。他会在$ctx.identity.cognitoIdentityId 中具有相同的值吗?如果他想用Twitter 登录怎么办。 $ctx.identity.cognitoIdentityId 中还会有相同的值吗?感谢您的帮助@mikuz。 上下文参考建议使用cognitoIdentityId 来识别来自 Cognito 联合身份的用户。我没有看到它与设备绑定的证据,但您可以测试该假设。将 Twitter 登录连接到用户池登录?我不认为这是 Federated Identities 支持的东西。当然,您可以开发一个系统来连接来自两个提供商的登录信息(您可能需要为此使用 Lambda 解析器)。 似乎cognitoIdentityId Cognito 触发器中不可用。我目前正在使用触发器来存储 Cognito 生成的 uniq userId。我可以在解析器中使用的 ID。我迷路了。 这个答案应该可以帮助您同时使用 Cognito UserPools 用户和 Federated Identities IAM 用户***.com/a/50109477/1207523 所以我必须使用Lambda 函数从每个查询中获取作者?

以上是关于带有 ctx.identity.username 的简单 GetItem 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 uuencode 的“sendmail”发送邮件,并带有主题

带有和不带有聚合的 sql 查询

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片

CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?

带有滚动的 Div 和带有绝对位置的内容

带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢