2012-10-02 2 views
1

나는 쿼리 문자열 인증을 사용하여 아마존 S3의 리소스에 대한 링크를 만드는이 스크립트를 발견했다.아마존 S3 쿼리 문자열 인증 유효 날짜

어떤 아이디어이 : 나는이 때문에의 -error "액세스 거부"이 스크립트에 의해 생성 된 URL 사용하여 리소스 열어보십시오

매번 "1349364847 잘못된 날짜 (시대 이후의 초이어야 함)" 올 수 있니?

require 'cgi' 
require 'base64' 
require 'openssl' 

def generate_secure_s3_url(s3_key) 
    # 
    # s3_key would be a path (including filename) to the file like: "folder/subfolder/filename.jpg" 
    # but it should NOT contain the bucket name or a leading forward-slash 
    # 
    # this was built using these instructions: 
    # http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?S3_QSAuth.html 
    # http://aws.amazon.com/code/199?_encoding=UTF8&jiveRedirect=1 

    s3_base_url  = '' # i.e. https://mybucket.s3.amazonaws.com 
    bucket   = '' # i.e. mybucket 
    access_key_id  = '' # your Amazon S3 access key ID 
    secret_access_key = '' # your Amazon S3 secret access key 
    expiration_date = Time.now.utc.to_i + (2*24*60*60) # 2 days from now in UTC epoch time (i.e. 1308172844) 

    # this needs to be formatted exactly as shown below and UTF-8 encoded 
    string_to_sign = "GET\n\n\n#{expiration_date}\n/#{bucket}/#{s3_key}".encode("UTF-8") 

    # we have to CGI/URL escape the signature since it would fail if it included/or + characters 
    signature = CGI.escape(Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), secret_access_key, string_to_sign)).gsub("\n","")) 

    return "#{s3_base_url}/#{s3_key}?AWSAccessKeyId=#{access_key_id} 
            &Expires=#{expiration_date} 
            &Signature=#{signature}" 
end 

답변

1

당신은 내가 조금이 씨름 결국 AWS-SDK에 정착 2.days.from_now.utc.to_i

사용할 수 require 'active_support/core_ext' 경우 내 생각 : 이 http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method

require 'aws-sdk' 

bucket = "bucketname" 
resource = "myfile.jpg" 
access_key_id = "12345" 
secret_access_key = "abcdef" 

s3 = AWS::S3.new(:access_key_id => access_key_id, :secret_access_key = secret_access_key) 
signed_url = s3.buckets[bucket].objects[resource].url_for(:read).to_s 

참고 : url_for는 또한 소요 :expires 옵션, 기본값은 1 시간입니다.