使用AWS Cognito

时间:2016-03-25 12:12:22

标签: amazon-web-services amazon-dynamodb amazon-iam amazon-cognito

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

1 个答案:

答案 0 :(得分:1)

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

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