Cognito:联合身份 ID 和用户属性

Posted

技术标签:

【中文标题】Cognito:联合身份 ID 和用户属性【英文标题】:Cognito: Federated Identity Id and User Attributes 【发布时间】:2017-08-15 08:51:41 【问题描述】:

故事:

我有一个包含用户的 Cognito 用户池。

此用户池是联合身份池中的身份验证提供程序。

我有一个 S3 存储桶,用户只能通过以下身份验证角色的策略上传到私有路径:

arn:aws:s3:::BUCKET_NAME/$cognito-identity.amazonaws.com:sub/*

用户通过 aws javascript sdk 直接从网络浏览器上传。

现在这很好用,我的用户仅限于他们上传的位置。他们上传的文件最终在存储桶中的路径如下所示:

us-east-1:0f26319c-1233-4c71-afb6-fac96a798ffb/random_file_name.txt

然后,每当添加文件时,我都会从这个 S3 存储桶触发一个 lambda。为了澄清,用户不会调用 lambda

问题:

我想从 lamda 访问用户池中的用户属性。我认为我可以使用 cognito-identity 子进行此查找。但是,我似乎找不到使用 SDK api 的方法来允许这样做。

使用此 API: http://boto3.readthedocs.io/en/latest/reference/services/cognito-identity.html#CognitoIdentity.Client.describe_identity 我能够获取登录名/用户池,但不能获取与此身份 ID 关联的用户名。

如果我有用户名,那么我可以使用 api:http://boto3.readthedocs.io/en/latest/reference/services/cognito-idp.html?highlight=cognito#CognitoIdentityProvider.Client.admin_get_user

任何想法如何使用联合身份 ID 来查找用户的属性?

【问题讨论】:

用户名是否可用于浏览器中的代码? @talentedmrjones 它是。但是,如果我使用用户属性来跟踪用户存储配额。这意味着任何用户都可以发送他想要的任何用户名。而且由于用户名通常是电子邮件,因此伪装成其他人相对容易。 【参考方案1】:

将文件存储在arn:aws:s3:::BUCKET_NAME/$cognito-idp.us-east-1.amazonaws.com:sub

这将被解析为文件夹名称,例如f4cfd4a8-0e94-4287-8c5e-1b01538dd2a1

使用来自 Cognito 用户池的用户的 sub,您可以 list users with that sub,例如在 cli 中:aws cognito-idp list-users --user-pool-id=us-east-1_ndhjGJQYE --filter "sub = 'f4cfd4a8-0e94-4287-8c5e-example'"

【讨论】:

cognito-idp.<aws-region>.amazonaws.com:sub中的sub其实是联邦id,和user-pool's sub不一样。因此,这不是正确的答案。【参考方案2】:

不幸的是,我不相信这是可能的。原因是,据我了解,从技术上讲,联合身份 ID 不必代表用户池用户。例如,如果您将其他身份验证提供程序连接到身份池,用户可能具有完全不同的属性。

【讨论】:

以上是关于Cognito:联合身份 ID 和用户属性的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Cognito - 联合身份的 OAuth 登录

如何使用 cognito 身份 id 获取用户属性(用户名、电子邮件等)

AWS Cognito 角色:区分联合身份池角色和用户池组角色

AWS CloudFormation 脚本失败 - 不允许 Cognito 使用您的电子邮件身份

如何通过 aws-cognito 属性将用户分组?

具有 Cognito 联合身份的 AWS AppSync IAM 授权