使用AWS Cognito实现AWS DynamoDB的细粒度访问控制

3
我正在开发一个简单的应用程序(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 的情况下验证用户?此外,欢迎对我的应用程序设计提出任何意见和批评。
2个回答

1
如果您需要使用用户的Facebook ID,请使用{{link1:Web身份联合}}。文档有点过时,但是AWS移动和JS SDK提供了Web身份凭证提供程序。如果您允许对所有密钥进行写访问,并且只允许读取与凭据绑定的Facebook ID,则此方法应该有效。

在使用 Facebook 网络身份联合时配置权限访问控制,应使用占位符 ${graph.facebook.com:id}。然而,在使用 Cognito 时,这些占位符将不再可用。因此,我的问题是:我是否可以针对我的用例使用 Cognito(似乎是最佳实践),还是应直接使用 IAM? - Hatim Khouzaimi
你好,使用Cognito,你只能基于用户的Cognito身份进行范围限制。 - Mark Mercurio
1
针对您的使用情况(在其中想要使用 ${graph.facebook.com:id}),唯一的选项是直接使用 SDK 中的 Web 身份验证凭据提供程序来直接使用 IAM。如果您使用 Cognito,那么只有 cognito ID 可用 ${cognito-identity.amazonaws.com:sub}. - perpil

0
如果您只使用Cognito身份池,您可以使用默认身份提供者映射。对于Facebook而言,它是这样的:

sub -> 映射到 user_id,例如 112177216992379

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接