2010-04-13 41 views
5

Lịch sử:Tạo url ký hợp đồng với CloudFront với Ruby

  1. Tôi tạo ra một tập tin quan trọng và pem trên Amazon.
  2. Tôi tạo ra một xô tin
  3. Tôi tạo ra một bản phân phối công cộng và sử dụng nguồn gốc id để kết nối với gầu tin: Công việc
  4. Tôi tạo ra một bản phân phối riêng và kết nối nó giống như # 3 - bây giờ tôi có thể truy cập bị từ chối : mong đợi

Tôi đang gặp khó khăn khi tạo url sẽ hoạt động. Tôi đã cố gắng để làm theo hướng dẫn được mô tả ở đây: http://docs.amazonwebservices.com/AmazonCloudFront/latest/DeveloperGuide/index.html?PrivateContent.html

Đây là những gì tôi đã có cho đến nay ... không hoạt động mặc dù - vẫn nhận được quyền truy cập bị từ chối:

def url_safe(s) 
    s.gsub('+','-').gsub('=','_').gsub('/','~').gsub(/\n/,'').gsub(' ','') 
end 

def policy_for_resource(resource, expires = Time.now + 1.hour) 
    %({"Statement":[{"Resource":"#{resource}","Condition":{"DateLessThan":{"AWS:EpochTime":#{expires.to_i}}}}]}) 
end 

def signature_for_resource(resource, key_id, private_key_file_name, expires = Time.now + 1.hour) 
    policy = url_safe(policy_for_resource(resource, expires)) 
    key = OpenSSL::PKey::RSA.new(File.readlines(private_key_file_name).join("")) 
    url_safe(Base64.encode64(key.sign(OpenSSL::Digest::SHA1.new, (policy)))) 
end 

def expiring_url_for_private_resource(resource, key_id, private_key_file_name, expires = Time.now + 1.hour) 
    sig = signature_for_resource(resource, key_id, private_key_file_name, expires) 
    "#{resource}?Expires=#{expires.to_i}&Signature=#{sig}&Key-Pair-Id=#{key_id}" 
end 

resource = "http://d27ss180g8tp83.cloudfront.net/iwantu.jpeg" 
key_id = "APKAIS6OBYQ253QOURZA" 
pk_file = "doc/pk-APKAIS6OBYQ253QOURZA.pem" 
puts expiring_url_for_private_resource(resource, key_id, pk_file) 

bất cứ ai có thể cho tôi làm gì sai ở đây?

Trả lời

11

All,

tôi vừa tạo ra một nhỏ đá quý có thể được sử dụng để đăng URL với Ruby sử dụng một số mã từ câu hỏi này CF:

https://github.com/stlondemand/aws_cf_signer

tôi có lẽ sẽ làm thay đổi đáng kể với nó trong vài tuần tới như tôi tr y để thực sự sử dụng nó trong ứng dụng của tôi nhưng muốn cho bạn biết tất cả khi bạn được liệt kê trong phần thuộc tính. :)

Cảm ơn bạn!

1

Yep, để lại chính sách như policy = policy_for_resource(resource, expires) làm việc cho tôi.

1

tôi chia hai right_aws (họ đã không trả lời yêu cầu kéo của tôi) ... Tôi thiết lập CloudFront luồng tin và tải về trong thư viện ACF của họ: http://github.com/wiseleyb/right_aws

1

Tôi đồng ý với Dylan. Anh ấy đã làm việc tốt với việc ký các url. Tôi gặp vấn đề tương tự. Tôi đã đi qua các tài liệu. Có một điều mà tôi không tìm thấy ở đó. Khi bạn tạo phân phối riêng, khi đó bạn thường cấp quyền truy cập cho các tệp, nhóm, v.v ...

Tôi đã nhận lỗi Truy cập bị từ chối cho đến khi tôi đã chỉ định Chính sách nhóm.

Bạn có thể chỉ định chính sách như:

{ 
    "Version":"2008-10-17", 
    "Id":"PolicyForCloudFrontPrivateContent", 
    "Statement":[{ 
      "Sid":" Grant a CloudFront Origin Identity access to support private content", 
      "Effect":"Allow", 
      "Principal":{ 
      "CanonicalUser":"here-goes-your-canonical-name-you-attached-to-cloudfront79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be" 
      }, 
      "Action":"s3:GetObject", 
      "Resource":"arn:aws:s3:::change-me-to-your-bucketname/*" 
     } 
    ] 
} 
Các vấn đề liên quan