【问题标题】:Finding user associated with a Cognito Identity查找与 Cognito 身份关联的用户
【发布时间】:2018-04-12 23:51:25
【问题描述】:

是否可以找到给定的认知身份属于哪个用户(在用户池中)。在 AWS 控制台中?以编程方式?

在 Cognito 身份池中,身份看起来像 <region>:<guid>。当这些身份来自 Cognito 用户池时,我们可以在 AWS 控制台中单击身份并访问一些信息。该信息仅限于 DateCreatedLinkedLogin=cognito-idp.<region>.amazonaws.com/<userpool_id>,它们仅告诉您此身份来自 Cognito 用户池以及哪个池,但这远非实际有用。我们真的可以分辨出用户池中的哪个用户吗?

【问题讨论】:

    标签: amazon-web-services amazon-cognito aws-cognito


    【解决方案1】:

    在与 AWS 开发人员支持交谈后,我发现无法将 Cognito 身份链接回 Cognito 用户池中的用户

    因此,如果您需要知道您的后端代表哪个用户执行代码,也许在 lambda 中,您有以下选择:

    • 在请求中发送用户信息。即使 lambda 调用使用 Cognito Identity 进行身份验证,并且 lambda 可以访问 lambda 上下文中的身份,如果您需要用户信息,您需要自己发送。例如在请求中发送 ID Token,在服务器端验证它,并从中提取用户信息。

    • 使用 Cognito Sync 为您的 Cognito 身份创建数据集。在数据集中存储一些用户信息。

    【讨论】:

      【解决方案2】:

      在 node.js lambda 的上下文中,我可以通过以下方式获取用户池身份:

      function getAuthenticatedUser(env, event) {
          let cognitoClient = 
              new AWS.CognitoIdentityServiceProvider(env.cognito.region);
      
          let userSub = event.requestContext.identity
              .cognitoAuthenticationProvider.split(':CognitoSignIn:')[1];
      
          let request = {
              UserPoolId: env.cognito.userPoolId,
              Filter: `sub = "${userSub}"`,
              Limit: 1
          };
      
          console.log(JSON.stringify(request, null, 2));
          return cognitoClient.listUsers(request).promise()
              .then((data) => {
                  console.log('Cognito users list...');
                  console.log(JSON.stringify(data,null,2));
                  return data.Users[0]
              });
      }
      

      event 是在执行时传递给 lambda 的标准事件结构。 (请参阅lambda event payloads 上的在线 AWS 文档中的 API Gateway Proxy Request Event)。

      【讨论】:

      • 查看 node.js 的 lambda 文档 (docs.aws.amazon.com/lambda/latest/dg/…) 似乎 lambda 函数有两个参数,第一个是事件,第二个是上下文。上下文数据类型的文档与您对“env”的使用不匹配,这让我感到困惑。您的函数看起来不像 node.js lambda...有趣的是在您的客户端和您的 lambdas 之间使用 API Gateway 将 requestContext 添加到您的 lambda 事件中,并且该 requestContext 包含“sub”。如果您的客户直接调用您的 lambda,您就不会得到这个
      • 这实际上是我从 lambda 主体调用的一个函数 - env 是一个变量,我填充了已加密到文件中的环境变量,使用 lambda 源压缩,然后解密使用 AWS KMS(密钥管理服务)执行 lambda。我提供此方法作为如何从 Cognito 联合身份获取 Cognito 用户池用户的示例。不过,我传递给此方法的 event 变量与作为参数传递给 lambda 入口点的 event 变量非常相似。
      • 好的,谢谢。不过,这并不能真正解决我的问题,您的答案能够从用户池中获取用户,因为您将用户信息作为 lambda 请求的一部分发送(即在您拥有 usersub 的请求中)。我的问题是,如果你只有一个 cognito 身份,如何才能弄清楚它属于谁。在与 AWS 支持人员交谈后,他们告诉我无法将身份链接回用户。
      • 了解 - 我的大多数用例都涉及与 API Gateway 或 AppSync 一起实现的 lambda,因此event 结构中至少有足够的元数据在这些情况下执行上述操作......抱歉,我无法提供更多帮助。
      猜你喜欢
      • 2018-11-07
      • 2018-02-11
      • 2017-12-01
      • 2017-02-28
      • 2016-09-26
      • 2019-04-01
      • 1970-01-01
      • 2017-08-15
      • 2017-06-08
      相关资源
      最近更新 更多