Saya baru dalam menulis Rails dan API. Saya butuh bantuan dengan solusi penyimpanan S3. Inilah masalah saya.
Saya menulis API untuk aplikasi iOS di mana pengguna login dengan API Facebook di iOS. Server memvalidasi pengguna terhadap token masalah Facebook kepada pengguna iOS dan mengeluarkan token Sesi sementara. Dari titik ini pengguna perlu mengunduh konten yang disimpan di S3. Konten ini hanya milik pengguna dan sebagian dari teman-temannya. Pengguna ini dapat menambahkan lebih banyak konten ke S3 yang dapat diakses oleh sekelompok orang yang sama. Saya kira ini mirip dengan melampirkan file ke grup Facebook ...
Ada 2 cara pengguna dapat berinteraksi dengan S3 ... serahkan ke server atau minta server untuk menerbitkan token S3 sementara (tidak yakin tentang kemungkinannya di sini) dan pengguna dapat mengakses URL konten langsung ke S3. Saya menemukan pertanyaan ini berbicara tentang pendekatan, namun, ini benar-benar tertanggal (2 tahun yang lalu): Pertanyaan arsitektur dan desain tentang mengunggah foto dari aplikasi iPhone dan S3
Jadi pertanyaannya:
- Apakah ada cara untuk membatasi pengguna untuk mengakses hanya beberapa konten di S3 saat token sementara dikeluarkan? Bagaimana saya bisa melakukan ini? Asumsikan ada ... katakanlah 100.000 atau lebih pengguna.
- Apakah sebaiknya membiarkan perangkat iOS menarik konten ini keluar secara langsung?
- Atau harus membiarkan server mengontrol semua konten yang lewat (ini tentu saja memecahkan keamanan)? Apakah ini berarti saya harus mengunduh semua konten ke server sebelum menyerahkannya kepada pengguna yang terhubung?
- Jika Anda tahu rel ... dapatkah saya menggunakan penjepit kertas dan permata aws-sdk untuk mencapai pengaturan ini?
Mohon maaf atas banyak pertanyaan dan saya menghargai setiap wawasan tentang masalah ini. Terima kasih :)
sumber
Jawaban:
Dengan menggunakan permata aws-sdk , Anda bisa mendapatkan url bertanda tangan sementara untuk objek S3 apa pun dengan memanggil
url_for
:Ini akan memberi Anda URL penggunaan sementara yang ditandatangani hanya untuk objek itu di S3. Kedaluwarsa setelah 20 menit (dalam contoh ini), dan hanya berlaku untuk satu objek itu.
Jika Anda memiliki banyak objek yang dibutuhkan klien, Anda harus menerbitkan banyak URL yang ditandatangani.
Perhatikan bahwa ini tidak berarti server perlu mengunduh setiap objek, itu hanya perlu mengautentikasi dan mengotorisasi klien tertentu untuk mengakses objek tertentu di S3.
Dokumen API dari Amazon: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth
sumber
ACCESS_KEY_ID
(Saya tidak ingat dari atas kepala saya), tapi itu tidak dimaksudkan sebagai rahasia.AWS_ACCESS_KEY_ID
. Saya awalnya mengiraAWS_SECRET_ACCESS_KEY
itu juga ditampilkan tetapi ternyata tidak.Jawaban di atas menggunakan permata aws-sdk-v1 yang lama daripada yang baru aws-sdk-resources versi 2.
Cara barunya adalah:
di mana your_object_key adalah jalur ke file Anda. Jika Anda perlu mencarinya, Anda akan menggunakan sesuatu seperti:
Informasi itu sangat sulit untuk digali, dan saya hampir menyerah dan menggunakan permata yang lebih tua.
Referensi
http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#presigned_url-instance_method
sumber
expires_in
mengharapkan data dalam bentuk detik, pastikan untuk mengonversinya terlebih dahulu.