Comment stocker des données dans S3 et permettre l'accès à l'utilisateur d'une manière sécurisée avec l'API / client iOS de rails?

je suis nouveau à l'écriture Rails et APIs. 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 Facebook token à L'utilisateur iOS et émet un token de Session temporaire. À 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 pour un utilisateur d'interagir avec S3... laisser 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 parlant des approches, mais elle est vraiment datée (il y a 2 ans): Question d'architecture et de design sur le téléchargement de photos de l'application iPhone et S3

Alors la question:

  • Existe-t-il un moyen de limiter l'accès d'un utilisateur à du contenu sur S3 lorsqu'un token temporaire est émis? Comment puis-je faire cela? Supposons qu'il n'y est... disons 100 000 utilisateurs ou plus.
  • est-ce une bonne idée de laisser le dispositif iOS tirer ce contenu directement?
  • Ou devrait laisser le serveur contrôler tous les passages de contenu (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 les rails... puis-je utiliser paperclip et aws-sdk gems pour réaliser ce genre de configuration?

toutes mes excuses pour les questions multiples et j'apprécie tout ce que vous avez à dire sur le problème. Merci:)

87
demandé sur Community 2012-05-30 10:28:17

2 réponses

en utilisant le aws-sdk gem , vous pouvez obtenir une url signée temporaire pour n'importe quel objet S3 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 URL d'utilisation temporaire signée pour seulement cet objet dans S3. Il expire après 20 minutes (dans cet exemple), et il n'est bon que pour un seul objet.

si vous avez beaucoup d'objets dont le client a besoin, vous aurez besoin d'émettre beaucoup d'URLs signées.

ou faut-il laisser le serveur contrôler tous les passages de contenu (ce qui résout bien sûr la sécurité)? 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 doit télécharger chaque objet, il a seulement besoin d'authentifier et d'autoriser des clients spécifiques pour accéder à des objets spécifiques dans S3.

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

112
répondu ejdyksen 2018-07-19 16:11:12

les réponses ci-dessus utilisent l'ancienne gem aws-sdk-v1 plutôt que la nouvelle version 2 d'aws-sdk-resources.

La nouvelle façon est:

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

où your_object_key est le chemin vers votre fichier. Si vous avez besoin de chercher cela, vous utiliserez quelque chose comme:

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

cette information était étonnamment difficile à déterrer, et j'ai presque abandonné et utilisé l'ancienne gemme.

référence

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

41
répondu chaqke 2015-07-15 00:41:14