【问题标题】:Given the user's identity id, how to get the user's details from cognito user pool?给定用户的身份 id,如何从 cognito 用户池中获取用户的详细信息?
【发布时间】:2018-05-18 09:34:54
【问题描述】:
  • 用户将图像上传到他/她在 S3 上的子文件夹。可以通过策略强制执行此操作的唯一方法是使用身份 ID:

    arn:aws:s3:::thebucket/${cognito-identity.amazonaws.com:sub}/avatar.jpg
    
  • 一个转换该图像的 lambda,被触发,并将转换保存到不同的 S3。

  • 但是现在,随着身份 id 的处置,该 lambda 需要使用对头像转换的引用来更新用户的数据库记录。这就是问题显而易见的地方,我只有身份 ID,我需要从中获取 cognito 用户的详细信息,这样我就可以在我的用户表中查找用户,其中 user:sub 作为标识符。

如何将这两者关联起来? cognito 中是否有一个 api 可以根据身份 id 给我sub

有没有更合理的方法?

【问题讨论】:

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


    【解决方案1】:

    我还没有找到方法来做到这一点。此外,如果您使用 Mobile SDK,您应该只获取传递给 Lambda 的 Cognito 身份 ID,您可以使用“context.identity.cognitoIdentityId”访问它。尽管one user 用户至少似乎通过使其与 Javascript 一起工作来挑战 AWS 文档集。

    看起来你在你的 s3 对象键中使用 sub,所以你有没有想过把它放在那里?您会在事件中获得有关 s3 对象的大量信息,包括密钥,在您的情况下包括您的子对象。

    您的 S3 事件应如下所示

    {  
       "Records":[  
          {  
             "eventVersion":"2.0",
             "eventSource":"aws:s3",
             "awsRegion":"us-east-1",
             "eventTime":"1970-01-01T00:00:00.000Z",
             "eventName":"ObjectCreated:Put",
             "userIdentity":{  
                "principalId":"AIDAJDPLRKLG7UEXAMPLE"
             },
             "requestParameters":{  
                "sourceIPAddress":"127.0.0.1"
             },
             "responseElements":{  
                "x-amz-request-id":"C3D13FE58DE4C810",
                "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
             },
             "s3":{  
                "s3SchemaVersion":"1.0",
                "configurationId":"testConfigRule",
                "bucket":{  
                   "name":"mybucket",
                   "ownerIdentity":{  
                      "principalId":"A3NL1KOZZKExample"
                   },
                   "arn":"arn:aws:s3:::mybucket"
                },
                "object":{  
                   "key":"HappyFace.jpg",
                   "size":1024,
                   "eTag":"d41d8cd98f00b204e9800998ecf8427e",
                   "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko",
                   "sequencer":"0055AED6DCD90281E5"
                }
             }
          }
       ]
    }
    

    您可以解析 S3 对象键,其中应该包含您的子对象。

    编辑:在分享了一些 cmets 之后,我认为你的情况是这样的:

    • 您有一个使用外部身份(例如 google)登录的用户
    • 此用户还有一个用户池身份
    • 身份尚未使用admin-link-provider-for-user 链接
    • 您想在某些操作后从外部身份查找用户池身份

    我假设链接这些帐户的东西是电子邮件地址?一种选择是在注册时链接帐户,使用 cognito 预注册触发器和 admin-link-provider-for-user 功能。

    您可以做的另一件事是获取当前(外部提供的)身份电子邮件,然后根据该电子邮件执行ListUsers。你会得到一个UserType 的列表,然后选择提供者是 Cognito 的那个,它应该会给你你想要的子。

    那是你所追求的吗?

    编辑:我们在 cmets 中讨论的另一个想法是直接从您的应用程序调用您的 Lambda 函数,而不是依赖于 S3 事件。这种方法的好处是您可以在调用中包含您喜欢的任何信息,例如正确的用户子。

    【讨论】:

    • 啊.. 如果 sub 实际上是来自 id 令牌的用户的 sub,您不知道我会多么高兴。那是身份标识的一个子项。但后来我想知道,如果身份 id 完全识别用户,也许那是我应该在我的user 表中使用的那个。但是我如何在成功的用户注册后获得它?另一件事:我可以确定所有用户的外部和内部身份(cognito 用户池、fb、g、t)都合并到同一个身份 ID 中吗?就在这里胡思乱想。也许我们会一起解决这个问题。
    • 我可以检查一下吗?您是说您的用户已使用外部提供商(如 google)登录,他们也有一个用户池帐户,并且它是您想要的用户池帐户子,而不是外部提供商?
    • 好吧,想象一下我如何为每个新的外部提供商帐户在我的 cognito 用户池中创建一个用户。并使用该用户的 ID(sub),我正在识别我的用户表中的用户记录。得到它? :} 所以是的,我需要以某种方式获取用户表中的用户记录。如果您认为我应该用不同的标识符来识别表,请试一试。
    • 我发现 admin-link-provider-for-user 很难实现,例如看到这个see this threadthis one。但它可能。 TBH 我认为 Cognito 与大多数其他 AWS 服务相比状况不佳。
    • 好的,太好了,所以在该应用程序中,当调用代码将项目保存在 S3 中时,您可以添加一些代码以将自定义消息发布到 SNS。
    猜你喜欢
    • 2021-12-31
    • 2020-04-21
    • 2020-07-01
    • 1970-01-01
    • 2021-04-09
    • 2019-02-28
    • 2021-04-03
    • 2011-05-30
    • 2020-05-27
    相关资源
    最近更新 更多