Come conservare i dati in S3 e consentire l’accesso degli utenti in modo sicuro con il client API / iOS di rails?

Sono nuovo di scrivere Rails e API. Ho bisogno di aiuto con la soluzione di archiviazione S3. Ecco il mio problema

Sto scrivendo un’API per un’app iOS in cui gli utenti accedono all’API di Facebook su iOS. Il server convalida l’utente contro i token problemi di Facebook per l’utente iOS e rilascia un token di sessione temporaneo. Da questo punto l’utente deve scaricare il contenuto archiviato in S3. Questo contenuto appartiene solo all’utente e ad un sottoinsieme dei suoi amici. Questo utente può aggiungere più contenuti a S3 a cui è ansible accedere dallo stesso gruppo di persone. Suppongo che sia simile ad albind un file a un gruppo Facebook …

Ci sono 2 modi in cui un utente può interagire con S3 … lasciare al server o fare in modo che il server rilasci un token S3 temporaneo (non sicuro delle possibilità qui) e l’utente può accedere direttamente agli URL dei contenuti su S3. Ho trovato questa domanda parlando degli approcci, tuttavia, è davvero datata (2 anni fa): domanda di architettura e di design sul caricamento delle foto dall’app per iPhone e S3

Quindi le domande:

  • C’è un modo per limitare un utente ad accedere solo ad alcuni contenuti su S3 quando viene rilasciato un token temporaneo? Come posso fare questo? Supponiamo che ci sia … diciamo 100.000 o più utenti.
  • È una buona idea lasciare che il dispositivo iOS estrae direttamente questo contenuto?
  • O dovrebbe lasciare che il server controlli tutto il passaggio dei contenuti (questo risolve ovviamente la sicurezza)? Questo significa che devo scaricare tutto il contenuto sul server prima di consegnarlo agli utenti connessi?
  • Se conosci i binari … posso usare le gemme di paperclip e aws-sdk per ottenere questo tipo di installazione?

Chiedo scusa per più domande e apprezzo qualsiasi comprensione del problema. Grazie 🙂

Usando la gem di aws-sdk , puoi ottenere un URL firmato temporaneo per qualsiasi object S3 chiamando url_for :

 s3 = AWS::S3.new( :access_key_id => 1234, :secret_access_key => abcd ) object = s3.buckets['bucket'].objects['path/to/object'] object.url_for(:get, { :expires => 20.minutes.from_now, :secure => true }).to_s 

Questo ti darà un URL di utilizzo temporaneo firmato per solo quell’object in S3. Scade dopo 20 minuti (in questo esempio) ed è valido solo per quell’unico object.

Se hai molti oggetti di cui ha bisogno il cliente, dovrai emettere molti URL firmati.

O dovrebbe lasciare che il server controlli tutto il passaggio dei contenuti (questo risolve ovviamente la sicurezza)? Questo significa che devo scaricare tutto il contenuto sul server prima di consegnarlo agli utenti connessi?

Si noti che questo non significa che il server deve scaricare ogni object, ma deve solo autenticare e autorizzare client specifici per accedere a oggetti specifici in S3.

Documenti API da Amazon: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth

Le risposte di cui sopra usano la vecchia gem aws-sdk-v1 piuttosto che la nuova versione di aws-sdk-resources 2.

Il nuovo modo è:

 aws_resource = Aws::S3::Resource::new aws_resource.bucket('your_bucket').object('your_object_key').presigned_url(:get, expires_in: 1*20.minutes) 

dove your_object_key è il percorso del tuo file. Se hai bisogno di cercare, useresti qualcosa come:

 s3 = Aws::S3::Client::new keys = [] s3.list_objects(bucket: 'your_bucket', prefix: 'your_path').contents.each { |e| keys << e.key } 

Quella informazione è stata sorprendentemente difficile da scavare, e ho quasi rinunciato e ho usato la gem più vecchia.

Riferimento

http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#presigned_url-instance_method