Eu sou novo na escrita de Rails e APIs. Preciso de ajuda com a solução de armazenamento S3. Aqui está meu problema.
Estou escrevendo uma API para um aplicativo iOS onde os usuários fazem login com a API do Facebook no iOS. O servidor valida o usuário em relação aos problemas de token do Facebook para o usuário iOS e emite um token de sessão temporário. A partir deste ponto, o usuário precisa baixar o conteúdo que está armazenado no S3. Este conteúdo pertence apenas ao usuário e a um subconjunto de seus amigos. Este usuário pode adicionar mais conteúdo ao S3, que pode ser acessado pelo mesmo grupo de pessoas. Acho que é semelhante a anexar um arquivo a um grupo do Facebook ...
Existem 2 maneiras de um usuário interagir com o S3 ... deixar isso para o servidor ou fazer com que o servidor emita um token S3 temporário (não tenho certeza das possibilidades aqui) e o usuário pode acessar as URLs de conteúdo diretamente para o S3. Achei esta pergunta falando sobre as abordagens, no entanto, é realmente datado (2 anos atrás): Questão de arquitetura e design sobre upload de fotos do aplicativo para iPhone e S3
Então, as perguntas:
- Existe uma maneira de limitar o acesso de um usuário a apenas algum conteúdo no S3 quando um token temporário é emitido? Como posso fazer isso? Suponha que haja ... digamos 100.000 ou mais usuários.
- É uma boa ideia permitir que o dispositivo iOS extraia esse conteúdo diretamente?
- Ou deveria deixar o servidor controlar a passagem de todo o conteúdo (isso resolve a segurança, é claro)? Isso significa que devo baixar todo o conteúdo para o servidor antes de entregá-lo aos usuários conectados?
- Se você conhece rails ... posso usar joias de clipe de papel e aws-sdk para conseguir esse tipo de configuração?
Peço desculpas por várias perguntas e agradeço qualquer esclarecimento sobre o problema. Obrigado :)
Respostas:
Usando a gem aws-sdk , você pode obter um url assinado temporário para qualquer objeto S3 chamando
url_for
:Isso fornecerá a você um URL de uso temporário e assinado apenas para aquele objeto no S3. Ele expira após 20 minutos (neste exemplo) e só é bom para aquele objeto.
Se você tiver muitos objetos de que o cliente precisa, precisará emitir muitos URLs assinados.
Observe que isso não significa que o servidor precisa fazer o download de cada objeto, ele só precisa autenticar e autorizar clientes específicos a acessarem objetos específicos no S3.
Documentos da API da Amazon: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth
fonte
ACCESS_KEY_ID
(não me lembro de cara), mas isso não é segredo.AWS_ACCESS_KEY_ID
. Originalmente, pensei queAWS_SECRET_ACCESS_KEY
também fosse exibido, mas não é.As respostas acima usam o antigo gem aws-sdk-v1 em vez do novo aws-sdk-resources versão 2.
A nova forma é:
onde your_object_key é o caminho para o seu arquivo. Se você precisar pesquisar isso, use algo como:
Essa informação foi surpreendentemente difícil de desenterrar, e quase desisti e usei a joia mais antiga.
Referência
http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#presigned_url-instance_method
fonte
expires_in
espera os dados na forma de segundos, apenas certifique-se de convertê-los primeiro.