Усиление: динамический обмен файлами S3 между пользователями Cognito - PullRequest
1 голос
/ 16 января 2020

У меня есть приложение для усиления реакции, которое позволяет пользователям загружать личные файлы и просматривать их. Я хотел бы реализовать функцию, в которой загрузчик может динамически указывать, кто еще (какие пользователи) также может просматривать и изменять эти файлы. Однако эти файлы останутся закрытыми только для загрузчика и будут доступны пользователям.

Мое приложение настроено на:

  • хранилище: 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 в базе данных).

Спасибо!

1 Ответ

0 голосов
/ 19 января 2020

Никогда не пробовал ничего подобного, однако одним из решений, вероятно, было бы использование лямбды через API-шлюз, который принимает URL-адреса, запрошенные другими людьми, и создает подписанный URL-адрес с истечением нескольких секунд. И вместо этого получает этот URL-адрес на клиенте.

...