【问题标题】:S3 dynamic cognito permissions on object对象上的 S3 动态认知权限
【发布时间】:2018-05-26 15:34:35
【问题描述】:

好吧,我开始发疯了。我有一个 Web 应用程序,用户使用他们的 Cognito 用户帐户登录。用户可以创建包含许多不同信息的案例项目。只有案例项目的创建者和管理员(一个特殊的 Cognito 组)才能看到案例项目。我通过连接到 Lambda 函数的安全 API 网关解决了这个问题,我可以使用 Cognito ID 令牌来获得我想要的东西。

现在我希望能够向这些案例项目添加附件/文件,但我不知道如何解决权限问题。

我应该如何将文件/对象上传到 S3 存储桶并即时设置权限???

第一种方法是通过连接到 Lambda 函数的 API 网关将文件作为二进制数据上传。但是从那里做什么呢?我想使用适用于 S3 的 JavaScript SDK,并找到了 S3.putObject、S3.upload 和 S3.putObjectAcl 之类的方法,但这并没有真正的帮助,因为我找不到使用 Cognito 帐户的方法。

另一种方法是直接从浏览器将文件上传到 S3,因此我开始阅读相关内容。发现你可以创建一个预签名的 url(比如这里:https://sanderknape.com/2017/08/using-pre-signed-urls-upload-file-private-s3-bucket/),但它仍然不能帮助我对对象设置正确的权限。

现在我正在考虑在我自己的 DynamoDB 中存储某种 ACL 以跟踪 S3 对象权限,但这感觉非常错误。一定是更好的方法?

所以我被困住了。这是我第一个与 AWS 合作的项目,所以我可能在这里遗漏了一些非常基本的东西。我应该以完全不同的方式解决这个问题吗?

请帮忙!

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-cognito


    【解决方案1】:

    我应该如何将文件/对象上传到 S3 存储桶并即时设置权限???

    我将此解释为您希望每个 Cognito 用户仅访问他们自己的 S3“文件夹”并上传或访问其中的文件。

    只是一个问题,他们有什么理由使用 API Gateway?我看到您正在上传图片 - API Gateway 有 10mb 的限制 - 所以您可以提供的图片将受到限制。

    您正在通过自定义授权方或用户池授权方传递 id 令牌。无论哪种方式,请确保您在集成响应中将整个事件传递给 Lambda 函数,以便您在事件对象中拥有可用的 id 令牌。

    现在 id 令牌在您的 Lambda 函数中可用。

    问题:与 Cognito 用户组关联的 IAM 角色是什么?

    请转发。

    访问权限归结为 IAM 角色的关联信任关系以及 IAM 角色变量。在 IAM 中,您必须使用 Policy 变量,以便担任该角色的人可以根据他们的 identityid(不是 idtoken 和 idtoken = userpool)访问 S3 存储桶。

    这就是第一个问题出现的地方。

    见:https://aws.amazon.com/blogs/mobile/understanding-amazon-cognito-authentication-part-3-roles-and-policies/

    您做事的方式不同,因为您使用的是 Cognito 用户组 - 通常的做法是使用用户池作为身份池的身份验证提供程序,然后使用 IAM 中的策略变量身份池的 Authenticated 角色的角色。

    除了上述问题,第二个问题是您正在使用 Cognito UserPools 和用户组,并且您正在客户端上进行身份验证,但是您想从 Lambda 函数向 S3 发出请求。

    假设 Lambda 函数如何获取驻留在客户端上的 AWS 密钥?

    即使 idtoken 在您的 Lambda 函数中可用,Lambda 函数也没有缓存临时 AWS 密钥。这就是我相信你会遇到未经授权的错误的地方。

    所以为了帮助我解决问题 - 请转发:

    1. Cognito 用户组的 IAM 角色
    2. 该 IAM 角色的信任关系
    3. 用户的 id 令牌(我想看看令牌中的声明)

    你有一个有趣的用例 - 转发信息 - 我可以看看。基本上,您只想使用带有用户组的 Cognito 用户池来应用解决方案 - 这可能是一个有效的用例。

    期待您的来信。

    【讨论】:

    • 问:“我将其解释为您希望每个 Cognito 用户仅访问他们自己的 S3“文件夹”并上传或访问其中的文件。” A:不,因为我写的文件应该连接到“case-items”。这些案例只能由案例的创建者或管理员访问。问:“只是一个问题,他们使用 API Gateway 有什么理由吗?” A:这是一个 Web 应用程序,所以我认为使用 API 是很自然的。如果你问我为什么将它用于文件 - 我不是。这只是我尝试过的事情之一。这就是为什么我在这里询问解决我的问题的最佳方法是什么。
    • 让我们再次总结一下。我已经有一个使用 lambda、api gateway、dynamodb、cognito 和用户池等功能的 web 应用程序。我的问题只是我应该如何处理文件以及解决问题的最佳方法。我愿意接受所有建议!
    猜你喜欢
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多