I want to allow users of an iPhone app to upload photos and use Amazon S3. There are 2 ways I see going about this:
- Upload from iPhone to my server, which proxies it then to Amazon S3.
- Upload from iPhone direct to S3
For option 1, the security is straightforward. I don't ever have to tell the iPhone my S3 secret. Downside is that everything is proxied through our server for uploads which sort of defeats the purpose of going to S3.
For option 2, in theory it's better but the issue is how do you enable the iPhone (or any mobile app on a different platform) to write into my S3 bucket without giving it my secret? Additionally, I'm not sure if this is a good design or not because the flow would be: iphone uploads to S3, gets the URL, then tells the server what the URL is so it can add it to our database to reference in the future. However, since the communication is separated into 2 legs (iphone->S3 vs iPhone->My-Server) it leaves it fragile as a non-atomic operation.
I've found some older info that references using Browser-based Uploads using POST but unsure if that is still the recommended approach. I'm hoping for a better solution where we can just use the REST APIs rather than relying on POST. I've also see the AWS iOS Beta SDK, but their docs didn't help much and I found an Amazon article that was equally unhelpful as it cautions you on what not to do, but doesn't tell you an alternative approach:
The mobile AWS SDKs sign the API
requests sent to Amazon Web Services
(AWS) in order to validate the
identity of the AWS account making the
request. Otherwise, a malicious
developer could easily make requests
to another developer's infrastructure.
The requests are signed using an AWS
Access Key ID and a Secret Access Key
that AWS provides. The Secret Access
Key is similar to a password, and it
is extremely important to keep secret.
Tip: You can view all your AWS
security credentials, including Access
Key ID and Secret Access Key, on the
AWS web site at
http://aws.amazon.com/security-credentials.
Embedding credentials in source code
is problematic for software, including
mobile applications, because malicious
users can de-compile the software or
view the source code to retrieve the
Secret Access Key.
Does anyone have any advice on the best architectural design and flow for this?
Update: The more I dig into this, it seems that a bunch of pople recommend using the HTTP POST method with the json policy file as described here: http://docs.amazonwebservices.com/AmazonS3/2006-03-01/dev/index.html?UsingHTTPPOST.html.
With this, the flow would be something like (1) iPhone makes request to my server, asking for policy file (2) server generates json policy file and gives back to client (3) iPhone does HTTP POST of photo + json policy to S3. I hate that I'm using HTTP POST in an apparently kludgy way but it appears to be better because it removes the need for my server to store the photo at all.
See Question&Answers more detail:
os