Je suis nouveau dans l'écriture de Rails et d'API. J'ai besoin d'aide avec la solution de stockage S3. Voici mon problème.
J'écris une API pour une application iOS où les utilisateurs se connectent avec l'API Facebook sur iOS. Le serveur valide l'utilisateur contre les problèmes de jeton Facebook à l'utilisateur iOS et émet un jeton de session temporaire. À partir de ce moment, l'utilisateur doit télécharger le contenu stocké dans S3. Ce contenu n'appartient qu'à l'utilisateur et à un sous-ensemble de ses amis. Cet utilisateur peut ajouter plus de contenu à S3 qui peut être consulté par le même groupe de personnes. Je suppose que c'est similaire à joindre un fichier à un groupe Facebook ...
Il existe 2 façons pour un utilisateur d'interagir avec S3 ... laisser le serveur au serveur ou demander au serveur d'émettre un jeton S3 temporaire (pas sûr des possibilités ici) et l'utilisateur peut accéder directement aux URL de contenu à S3. J'ai trouvé cette question qui parlait des approches, cependant, elle est vraiment datée (il y a 2 ans): question d' architecture et de conception sur le téléchargement de photos depuis l'application iPhone et S3
Donc les questions:
- Existe-t-il un moyen de limiter l'accès d'un utilisateur à certains contenus sur S3 lorsqu'un jeton temporaire est émis? Comment puis-je faire ceci? Supposons qu'il y ait ... disons 100 000 utilisateurs ou plus.
- Est-ce une bonne idée de laisser l'appareil iOS extraire ce contenu directement?
- Ou devrait-il laisser le serveur contrôler tout le contenu qui passe (cela résout la sécurité bien sûr)? Cela signifie-t-il que je dois télécharger tout le contenu sur le serveur avant de le transmettre aux utilisateurs connectés?
- Si vous connaissez les rails ... puis-je utiliser des trombones et des gemmes aws-sdk pour réaliser ce genre de configuration?
Toutes mes excuses pour plusieurs questions et j'apprécie tout aperçu du problème. Merci :)
Réponses:
En utilisant le gem aws-sdk , vous pouvez obtenir une URL signée temporaire pour n'importe quel objet S3 en appelant
url_for
:Cela vous donnera une URL d'utilisation temporaire signée uniquement pour cet objet dans S3. Il expire après 20 minutes (dans cet exemple), et il n'est bon que pour cet objet.
Si vous avez beaucoup d'objets dont le client a besoin, vous devrez émettre de nombreuses URL signées.
Notez que cela ne signifie pas que le serveur doit télécharger chaque objet, il doit uniquement authentifier et autoriser des clients spécifiques à accéder à des objets spécifiques dans S3.
Documents d'API d'Amazon: https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth
la source
ACCESS_KEY_ID
(je ne me souviens pas du haut de ma tête), mais ce n'est pas censé être un secret.AWS_ACCESS_KEY_ID
. Au départ, je pensais que celaAWS_SECRET_ACCESS_KEY
était également affiché mais ce n'est pas le cas.Les réponses ci-dessus utilisent l'ancienne gemme aws-sdk-v1 plutôt que la nouvelle version 2 de aws-sdk-resources.
La nouvelle façon est:
où your_object_key est le chemin de votre fichier. Si vous avez besoin de chercher cela, vous utiliserez quelque chose comme:
Cette information était étonnamment difficile à déterrer, et j'ai presque abandonné et utilisé la gemme plus ancienne.
Référence
http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html#presigned_url-instance_method
la source
expires_in
attend les données sous forme de secondes, assurez-vous simplement de les convertir en premier.