使用 AWS Cognito 对 AWS DynamoDB 进行细粒度访问控制

Fine-grained access control for AWS DynamoDB using AWS Cognito

我正在开发一个简单的应用程序 (ios),每个用户都可以在其中向其他用户(他们的 Facebook 好友)发送简单的消息(每个消息由几个数据槽组成,目前都是字符串) .人们通过 Cognito 使用他们的 Facebook 帐户登录,我在 DynamoDB 中使用单个 table 管理用户帐户,其中主键是 Facebook id(辅助键是唯一的消息 id)。当用户 A 向用户 B 发送消息时,table 中添加了两个几乎相同的行,它们包含消息,它们之间的唯一区别是主键(一个是 A 的 facebook id,另一个是 B 的) .因此,当用户登录并查看他的帐户时,她会检索与她的 facebook id 对应的所有行,从而访问她发送的消息和已发送给她的消息。

目前,每个用户都可以访问 table 中的所有行,这是一个安全漏洞。我查看了一些文档,在这种情况下,似乎可以通过将以下代码段添加到 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 提供了网络身份凭证提供程序。

如果您允许对所有密钥进行写入访问并仅对与凭据关联的 facebook id 进行读取访问,则此方法应该有效。