У меня есть приложение для усиления реакции, которое позволяет пользователям загружать личные файлы и просматривать их. Я хотел бы реализовать функцию, в которой загрузчик может динамически указывать, кто еще (какие пользователи) также может просматривать и изменять эти файлы. Однако эти файлы останутся закрытыми только для загрузчика и будут доступны пользователям.
Мое приложение настроено на:
- хранилище: S3
- auth: Cognito
- db: DynamoDB
- api: graphQL
Приложение хранит личные файлы в корзине S3:
import { Storage } from 'aws-amplify';
const response = await Storage.put(file.name, file, { level: 'private', progress(progress) {...} });
Путь к возвращаемому файлу из response.key
сохраняется в базе данных с использованием API GraphQL на основе этой схемы:
type File @model @auth(rules: [{ allow: owner }]) {
id: ID!
s3Key: String
}
При представлении данных и файлов загрузчику я запрашиваю эту схему, чтобы отобразить соответствующие файлы только для указанного пользователя c и извлеките его, используя:
url = await Storage.get(response.key, {level: 'private'})
Это потому, что идентификатор Cognito этого пользователя используется в политике S3 (где-то?) для установления sh доступа.
Теперь я хотел бы организовать обмен файлами между некоторыми пользователями. Это было довольно легко сделать на уровне базы данных с помощью этой модификации схемы:
type File @model @auth(rules: [{ allow: owner }, { allow: owner, ownerField: "owners" }]) {
id: ID!
s3Key: String
owners: [String]
}
Так что теперь загрузчик может указать пользователей, которые смогут получать эти данные из БД, просто добавляя имена пользователей к массиву в поле owners
.
Однако я не уверен, как сделать файлы, хранящиеся в корзине S3, доступными для других владельцев.
Я не могу использовать ключ владельца потому что сохраненные файлы доступны только для загрузчика (как они должны), и я не уверен, как код может указывать различные идентификаторы Cognito, которые могут получить доступ / изменить определенный файл. Мне нужно найти способ предоставить доступ.
Просто чтобы уточнить: загрузчик списков файлов, который конкретно (cognito identity / username) может получить доступ к файлу. Они могут добавлять и удалять на go учетные записи с доступом к файлу (так что это в основном модификация поля owners
в базе данных).
Спасибо!