我正在开发一个简单的应用程序(ios),每个用户都可以向其他用户(他们的 Facebook 好友)发送简单的消息(每个消息由几个数据槽组成,目前都是字符串)。人们通过 Cognito 使用 Facebook 帐户登录,我使用 DynamoDB 中的单个表管理用户帐户,其中主键是 Facebook id(辅助键是唯一的消息 id)。当用户 A 向用户 B 发送消息时,表中会添加两行几乎相同的行,它们包含消息,它们之间唯一的区别是主键(一个是 A 的 facebook id,另一个是 B 的)。因此,当用户登录并检查他的帐户时,她会检索与她的 facebook id 对应的所有行,从而访问她发送的消息和已发送给她的消息。
目前,每个用户都可以访问表中的所有行,这是一个安全缺陷。我查看了一些文档,在这种情况下,似乎可以通过将以下代码片段添加到 IAM 策略来执行细粒度的访问控制:
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${graph.facebook.com:id}"
]
}
}
不幸的是,
${graph.facebook.com:id}
不适用于 Cognito,我应该使用 ${cognito-identity.amazonaws.com:sub}
来识别用户。问题是,使用后者需要使用 Cognito id 作为主键而不是 Facebook id,这导致了我的问题:可以获取朋友的 Facebook id,但不能获取他们的 Cognito id,这使得无法将消息发送到他们使用以前的架构。
在保留 Cognito 的同时是否有任何可能的解决方案,或者我应该在没有 Cognito 的情况下对用户进行身份验证?另外,欢迎对我的应用程序设计提出任何评论和批评。
如果您需要使用用户的 facebook id,请使用 Web Identity Federation。该文档有点过时,但 aws mobile 和 js sdks 提供了 Web 身份凭证提供程序。
如果您允许对所有密钥进行写入访问并仅对与凭据绑定的 facebook id 进行读取访问,则此方法应该有效。
如果您仅使用 Cognito 身份池,则可以使用 默认身份提供商映射。对于 Facebook 来说是:
-> 映射到sub
,例如user_id
112177216992379
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${graph.facebook.com:sub}"
]
}
}