我有一个 amplify React 应用程序,它允许用户上传私有(private) 文件并查看它们。我想实现一项功能,其中上传者可以动态指定其他人(哪些用户)也可以查看和修改这些文件。但是,这些文件将只对上传者保密,并与用户共享,没有其他人。
我的应用设置为:
- 存储:S3
- 授权:认知
- 数据库:DynamoDB
- 应用程序接口(interface):graphQL
应用程序将私有(private)文件存储在 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 存储桶中的文件可供其他所有者使用。
我不能使用所有者的 key ,因为存储的文件仅供上传者使用(他们应该这样做),而且我不确定代码如何指定可以访问/修改特定文件的不同 Cognito 身份。我需要找到一种方法来授予访问权限。
澄清一下:文件的上传者列出了具体(认知身份/用户名)可以访问该文件的人。他们可以随时添加和删除具有文件访问权限的帐户(因此这基本上是对数据库中的 owners
字段的修改)。
谢谢!
最佳答案
从来没有尝试过这样的事情,但是一个解决方案可能是通过 API 网关的 lambda,它获取其他人请求的 URL 并创建一个签名的 URL,并在几秒钟内过期。然后在客户端获取该 URL。
关于reactjs - 放大 : dynamically sharing S3 files between Cognito users,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59767918/