Je veux permettre aux utilisateurs d'une application iPhone de télécharger des photos et d'utiliser Amazon S3. Il y a deux façons de procéder selon moi :
- Téléchargement de l'iPhone vers mon serveur, qui le transmet ensuite par proxy à Amazon S3.
- Télécharger de l'iPhone directement sur S3
Pour l'option 1, la sécurité est simple. Je n'ai jamais à révéler mon secret S3 à l'iPhone. L'inconvénient, c'est que tout passe par notre serveur pour les téléchargements, ce qui va à l'encontre du but recherché par S3.
Pour l'option 2, c'est théoriquement mieux, mais le problème est le suivant : comment permettre à l'iPhone (ou à toute application mobile sur une plateforme différente) d'écrire dans mon seau S3 sans lui donner mon secret ? En outre, je ne suis pas sûr que ce soit une bonne conception ou non, car le flux serait le suivant : l'iPhone télécharge vers S3, obtient l'URL, puis indique au serveur quelle est l'URL afin qu'il puisse l'ajouter à notre base de données pour la référencer à l'avenir. Cependant, puisque la communication est séparée en deux parties (iphone->S3 vs iPhone->Mon-Serveur), elle est fragile en tant qu'opération non atomique.
J'ai trouvé des informations plus anciennes qui font référence à l'utilisation de Téléchargements par navigateur à l'aide de POST mais je ne suis pas sûr que ce soit toujours l'approche recommandée. J'espère une meilleure solution qui nous permettrait d'utiliser les API REST plutôt que de dépendre de POST. J'ai également vu le SDK bêta pour AWS iOS mais leur documentation ne m'a pas beaucoup aidé et j'ai trouvé une Article Amazon qui n'était pas non plus utile car il vous mettait en garde sur ce que no à faire, mais ne vous indique pas d'approche alternative :
Les SDK mobiles AWS signent l'API envoyées à Amazon Web Services (AWS) afin de valider l'identité l'identité du compte AWS à l'origine de la demande. Sinon, un développeur malveillant malveillant pourrait facilement faire des demandes à l'infrastructure d'un autre développeur. Les demandes sont signées à l'aide d'un AWS Access Key ID et une clé d'accès secrète qu'AWS fournit. La clé d'accès secrète est similaire à un mot de passe, et elle et il est extrêmement important de la garder secrète.
Conseil : vous pouvez afficher tous vos identifiants de sécurité AWS y compris l'ID de la clé d'accès ID de clé d'accès et la clé d'accès secrète, sur le site Web d'AWS à l'adresse http://aws.amazon.com/security-credentials .
Intégrer les informations d'identification dans le code source est problématique pour les logiciels, y compris applications mobiles, car les utilisateurs malveillants malveillants peuvent décompiler le logiciel ou consulter le code source pour récupérer la clé d'accès secrète.
Quelqu'un a-t-il des conseils sur la meilleure conception architecturale et le meilleur flux pour cela ?
Mise à jour : Plus je creuse la question, plus il semble qu'un grand nombre de personnes recommandent d'utiliser la méthode HTTP POST avec le fichier de politique json comme décrit ici : http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/index.html?UsingHTTPPOST.html .
Avec cela, le flux serait quelque chose comme (1) l'iPhone fait une requête à mon serveur, demandant le fichier de politique (2) le serveur génère le fichier de politique json et le rend au client (3) l'iPhone fait HTTP POST de la photo + politique json à S3. Je déteste utiliser HTTP POST d'une manière apparemment maladroite, mais il semble que ce soit mieux parce que mon serveur n'a plus besoin de stocker la photo.