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

问题描述 投票:0回答:2

我正在开发一个简单的应用程序(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 的情况下对用户进行身份验证?另外,欢迎对我的应用程序设计提出任何评论和批评。

amazon-web-services amazon-dynamodb amazon-iam amazon-cognito
2个回答
1
投票

如果您需要使用用户的 facebook id,请使用 Web Identity Federation。该文档有点过时,但 aws mobile 和 js sdks 提供了 Web 身份凭证提供程序。

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


0
投票

如果您仅使用 Cognito 身份池,则可以使用 默认身份提供商映射。对于 Facebook 来说是:

sub
-> 映射到
user_id
,例如
112177216992379

"Condition": {
  "ForAllValues:StringEquals": {
    "dynamodb:LeadingKeys": [
      "${graph.facebook.com:sub}"
    ]
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.