2010-07-30 31 views
6

Một trong những khách hàng của tôi có trang web hiển thị phương tiện đã được tải lên từ ứng dụng khách.Làm cách nào để cho phép khách hàng tải lên Amazon S3 mà không đưa ra chìa khóa của tôi?

Ứng dụng này ban đầu sử dụng FTP, nhưng chúng tôi đang chuyển sang S3 để lưu trữ dữ liệu và lý do hiệu suất khác nhau.

Điều tôi muốn làm là cho phép khách hàng này tải tệp trực tiếp lên cửa hàng S3 trung tâm của chúng tôi (ala dropbox/jungledisk etc etc), nhưng tôi không thể thấy cách thực hiện điều này mà không bàn giao phím và nhúng chúng vào ứng dụng - không lý tưởng!

Có cách nào để cung cấp ứng dụng khách với khóa phiên/URL tải lên tạm thời/thứ gì đó không? Điều này có thể được thực hiện thông qua api trang web của chúng tôi - trong đó tất nhiên có đầy đủ quyền truy cập vào bất kỳ khóa bí mật S3 yêu cầu.

Đề xuất?

Trả lời

7

Có, điều này có thể thực hiện được. Những gì bạn cần làm là tạo một tệp chính sách đã ký mỗi lần tải lên hoặc cho mỗi người dùng. Tệp chính sách, chữ ký và một số dữ liệu khác phải được chương trình máy khách gửi bằng yêu cầu POST tới nhóm bạn muốn sử dụng. Amazon sẽ kiểm tra yêu cầu, kiểm tra xem các tham số có nằm trong giới hạn của tệp chính sách đi kèm với yêu cầu không và sau đó cho phép đăng bài. Lưu ý rằng chính sách này không được nhầm lẫn với chính sách nhóm . Đây là, trên thực tế, một chính sách có thể thay đổi theo yêu cầu nếu bạn muốn, và nó được gửi bởi chương trình khách hàng (sau khi chương trình khách hàng nhận được một bản sao đã ký từ bạn).

Chi tiết đầy đủ về điều này có thể được tìm thấy trong phần Browser Based Uploads Using POST của tài liệu S3. Tôi khuyên bạn nên xem xét chi tiết phần HTML Forms và đánh giá cách nhận thông số POST cho ứng dụng của bạn (đối với trình duyệt bạn có thể gửi HTML, đó là cách tài liệu được diễn đạt, đối với chương trình không phải trình duyệt bạn có thể cần một cuộc gọi API của một số loại theo sau là khách hàng gửi một POST đến S3).

Bạn cũng có thể kiểm tra trang web này có thể cung cấp cho bạn một ý tưởng về làm thế nào để thiết lập các thông số: http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html

3

của nó có thể làm điều đó bằng hình thức dựa upload HTML: article này một công việc tốt giải thích nó như thế nào có khả năng. Sau khi đọc số article bạn có thể sử dụng các tập lệnh của tôi được đề cập bên dưới để làm cho cuộc sống dễ dàng hơn.

Đây là tập lệnh python mà tôi sử dụng để tạo chính sách, chữ ký và chuỗi base64 của tôi.

IMP: Đảm bảo rằng tệp policy.json là trong cùng thư mục

import base64 
import hmac, hashlib 
import os 
AWS_SECRET_ACCESS_KEY = 'Your Access Key' 

os.system('clear') 
print "This policy generator is for key : " + AWS_SECRET_ACCESS_KEY 
print "Make sure this is the correct key." 
print "IMP: Please be consistent with the file policy.json small changes in space or newline can fail policy" 

policy_document = file("policy.json",'rb').read() 
policy = base64.b64encode(policy_document) 
signature = base64.b64encode(hmac.new(AWS_SECRET_ACCESS_KEY, policy, hashlib.sha1).digest()) 

print 
print "Policy (BASE64_POLICY to be inserted in HTML):-" 
print policy 
print 
print "Signature:-" 
print signature 
print 

Và đây là file policy.json tương ứng tôi sử dụng:

{ 
    "expiration": "2014-01-01T00:00:00.00Z", 
    "conditions": [ 
    {"bucket": "BUCKET NAME" }, 
    ["starts-with", "$key", "PREFIX_IF_ANY"], 
    {"acl": "public-read" }, 
    {"success_action_redirect": "http://REDIRECTED_URL" }, 
    ["starts-with", "$Content-Type", "CONTENT_TYPE"], 
    ["content-length-range", 0, 1048576], 
    ] 
} 

HTML biểu mẫu cho mã này là như vậy:

<html> 
    <head> 
     <title>S3 POST Form</title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    </head> 

    <body> 
     <form action="http://BUCKET_NAME.s3.amazonaws.com/" method="post" enctype="multipart/form-data"> 
      <input type="hidden" name="key" value="picbum/${filename}"> 
      <input type="hidden" name="AWSAccessKeyId" value="AccessID"> 
      <input type="hidden" name="acl" value="public-read"> 
      <input type="hidden" name="success_action_redirect" value="http://REDIRECTED_URL"> 
      <!-- Fill these HTML fields with data generated from python script --> 
      <input type="hidden" name="policy" value='BASE64_POLICY'> 
      <input type="hidden" name="signature" value="SIGNATURE_GENERATED"> 
      <input type="hidden" name="Content-Type" value="CONTENT_TYPE"> 
      <!-- Include any additional input fields here --> 

      File to upload to S3: 
      <input name="file" type="file"> 
      <br> 
      <input type="submit" value="Upload File to S3"> 
     </form> 
    </body> 
</html> 
+0

Đây là lá phiếu của tôi vì bài viết giải thích mọi thứ. – Saeger

Các vấn đề liên quan