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 角色:区分联合身份池角色和用户池组角色