Amplify:在 Cognito 用户之间动态共享 S3 文件

Amplify: dynamically sharing S3 files between Cognito users

我有一个 amplify React 应用程序,允许用户上传 私人 文件并查看它们。我想实现一项功能,其中上传者可以动态指定其他人(哪些用户)也可以查看和修改这些文件。但是,这些文件将只对上传者保密,并与用户共享,没有其他人。

我的应用设置为:

该应用程序将私有文件存储在 S3 存储桶中:

import { Storage } from 'aws-amplify';
const response = await Storage.put(file.name, file, { level: 'private', progress(progress) {...} });

response.key 返回的文件路径使用基于此架构的 graphQL api 存储在数据库中:

type File @model @auth(rules: [{ allow: owner }]) {
    id: ID!
    s3Key: String
}

向上传者展示数据和文件时,我查询此模式以仅显示与特定用户相关的文件并使用以下方式获取它们:

url = await Storage.get(response.key, {level: 'private'})

这是因为该用户的 Cognito 身份在 S3 策略(某处?)中用于建立访问权限。

现在,我想实现一些用户之间的文件共享。通过对架构的这种修改,在数据库级别上很容易做到这一点:

type File @model @auth(rules: [{ allow: owner }, { allow: owner, ownerField: "owners" }]) {
    id: ID!
    s3Key: String
    owners: [String]
}

因此,现在上传者可以通过简单地将用户名添加到 owners 字段中的数组来指定能够从数据库中提取此数据的用户。

但是,我不确定如何让存储在 S3 存储桶中的文件可供其他所有者使用。

我不能使用所有者的密钥,因为存储的文件仅供上传者使用(他们应该这样做),而且我不确定代码如何指定可以 access/modify 特定文件的不同 Cognito 身份。我需要找到一种方法来授予访问权限。

澄清一下:文件的上传者列出了具体的(认知身份/用户名)可以访问该文件的人。他们可以随时添加和删除具有文件访问权限的帐户(因此这基本上是对数据库中 owners 字段的修改)。

谢谢!

从来没有尝试过这样的事情,但是一个解决方案可能是通过 API 网关的 lambda,需要 URL 其他人请求并创建一个签名的 URL 并在几秒钟内过期.. 而是在客户端获取 URL。