Традиционный способ - загрузить этот материал на сервер и передать его пользователю.
Нет, это не так. Никто не должен этим заниматься.
Однако зачем передавать эти дополнительные данные через мое приложение, когда я могу просто дать ключ / токен этому пользователю ...
Вы идете в правильном направлении здесь. К счастью, S3 определяет лучший способ, который также является обычным методом.
Вместо того, чтобы давать ключ, вы криптографически подписываете URL. Ключ / секрет остаются на стороне сервера и скрыты от конечного пользователя. Вы создаете URL, который указывает, какой ресурс должен быть загружен, а также другие параметры, такие как срок годности для этого URL. Затем вы «подписываете» его, используя вычисленное значение, которое может рассчитать только тот, у кого есть ключ / секрет. Полученный URL-адрес может быть передан непосредственно вашему клиенту через ответ API или любым другим способом.
Затем клиент запрашивает ресурс с этим URL-адресом, и он подается непосредственно из S3. S3 проверяет подпись, знает, что она от вас, и подает соответствующий ответ.
Пример, если вы используете S3 JS SDK:
s3.getSignedUrl('getObject', {
Bucket: 'bucket',
Key: 'path/to/object'
});
См. также: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl -свойство