96 votes

Comment stocker des données dans S3 et permettre un accès utilisateur de manière sécurisée avec le client rails API / iOS?

Je suis nouveau à l'écriture de Rails et de l'Api. J'ai besoin de l'aide avec le S3 solution de stockage. Voici mon problème.

Je suis en train d'écrire une API pour une application iOS, où les utilisateurs se connecter avec Facebook API sur iOS. Le serveur valide de l'utilisateur contre le jeton Facebook des questions à l'utilisateur iOS et questions temporaire jeton de Session. À partir de ce stade, l'utilisateur doit télécharger le contenu qui est stocké dans S3. Ce contenu n'appartient à l'utilisateur et un sous-ensemble de ses amis. Cet utilisateur peut ajouter plus de contenu au S3 qui peut être consulté par le même groupe de personnes. J'imagine que c'est similaire à attacher un fichier à un Facebook du groupe...

Il y a 2 façons un utilisateur peut interagir avec le S3... le laisser sur le serveur ou le serveur d'émission temporaire S3 jeton (pas sûr de l'possibilités ici) et l'utilisateur peut frapper sur le contenu de l'Url directement dans S3. J'ai trouvé cette question de parler d'approches, cependant, il est vraiment daté (il y a 2 yrs): Architecture et conception de la question sur le téléchargement de photos à partir de l'application iPhone et S3

Donc les questions:

  • Est-il un moyen de limiter un utilisateur d'accéder uniquement à certains contenus sur S3 lorsqu'un jeton temporaire est délivré? Comment puis-je faire cela? Supposer il y a... plus de 100 000 utilisateurs.
  • Est-ce une bonne idée de laisser l'appareil iOS tirer de ce contenu directement?
  • Ou devrait laisser le serveur de contrôle de l'ensemble du contenu de passage (ce qui résout la sécurité bien sûr)? Cela signifie que je dois télécharger tout le contenu du serveur avant de la transmettre à des utilisateurs connectés?
  • Si vous connaissez des rails... puis-je utiliser un trombone, et aws sdk gemmes pour obtenir ce genre de configuration?

Toutes mes excuses pour les questions à choix multiples et j'apprécie toute l'aperçu du problème. Merci :)

115voto

ejdyksen Points 677

À l'aide de l' aws sdk gem, vous pouvez obtenir un temporaire signé url d'un S3 objet en appelant 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

Cela vous donnera une signature, l'utilisation temporaire d'URL pour seul objet dans S3. Elle expire au bout de 20 minutes (dans cet exemple), et il n'est valable que pour un seul objet.

Si vous avez beaucoup d'objets les besoins du client, vous aurez besoin d'émettre beaucoup de signé Url.

Ou devrait laisser le serveur de contrôle de l'ensemble du contenu de passage (ce qui résout la sécurité bien sûr)? Cela signifie que je dois télécharger tout le contenu du serveur avant de la transmettre à des utilisateurs connectés?

Notez que cela ne signifie pas que le serveur a besoin de télécharger à chaque objet, il suffit de s'authentifier et autoriser des clients spécifiques pour accéder à des objets spécifiques dans S3.

Les docs de l'API d'Amazon: http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html

14voto

dineth Points 2103

Si quelqu'un est intéressé, j'ai écrit sur mon solution finale dans un article de blog: http://tmblr.co/ZqibVwRI2W7o (une brève explication est présente sous forme de commentaire sur la réponse précédente).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X