根据用户的身份ID,如何从cognito用户池中获取用户的详细信息?

时间:2017-12-04 20:31:56

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

  • 用户在S3上将图像上传到他/她的子文件夹。使用策略强制实施的唯一方法是使用身份标识:

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

  • 但是现在,随着身份ID的处理,lambda需要使用对头像转换的引用来更新用户的db记录。这是问题很明显的地方,我只有身份ID,从中我需要了解cognito用户的详细信息,以便我可以在我的用户表中查找用户:sub作为标识符的用户。

我如何关联这两者?在cognito中是否有api可以根据身份ID给我sub

是否有更合理的方式?

1 个答案:

答案 0 :(得分:0)

我一直无法找到办法。此外,如果您使用的是Mobile SDK,则只能将Cognito Identity ID传递给Lambda,您可以使用“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对象密钥,该对象密钥应包含您的sub。

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

  • 您的用户已使用外部身份登录(例如Google)
  • 此用户还具有用户池标识
  • 未使用admin-link-provider-for-user
  • 关联身份
  • 您希望在执行某些操作后从外部标识中查找用户池标识

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

您可以做的另一件事是获取当前(外部提供的)身份电子邮件,然后根据该电子邮件执行ListUsers。您将获得UserType的列表,然后选择提供者为Cognito的列表,该列表应该为您提供所需的子列表。

那是你的事吗?

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