2016-07-28 9 views
0

アップロードポリシーとともにHTML POSTフォームを使用してS3へのアップロードを実行しようとしていますが、私はそれに合わせて署名を作成するのに苦労しています。AWSリクエストロジックのシグネチャを生成する - SignatureDoesNotMatchを返す

アップロードフォームを送信すると、403とSignatureDoesNotMatchレスポンスが返されます。ガイドとしてこれを使用して

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html私は次のように作ってみた:

policy_hash = { 
    'expiration' => (Time.now.utc + 3600 * 3).iso8601 
} 

@policy = Base64.encode64(JSON.dump(policy_hash)).gsub("\n","") 

kDate = OpenSSL::HMAC.digest('sha256', "AWS4" + @secret_access_key, Time.now.strftime("%Y%m%d")) 
kRegion = OpenSSL::HMAC.digest('sha256', kDate, AWS_REGION) 
kService = OpenSSL::HMAC.digest('sha256', kRegion, "s3") 
kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request") 

@signature = Digest::SHA256.hexdigest(
    OpenSSL::HMAC.digest('sha256', kSigning, @policy) 
) 

そして私はからでポリシーと署名を含めています。私はAWS_REGION@secret_access_keyが正しいことを知っています。私は他の場所で使っているからです。

上記のコードに間違っている人はいますか?または他の指導をしていますか?

答えて

0
@signature = Digest::SHA256.hexdigest(
    OpenSSL::HMAC.digest('sha256', kSigning, @policy) 
) 

あなたは、あなたがSHA256ハッシュを進エンコードでそれをハッシュしているもの、あなたの署名をする必要がありますし、代わりに六角をコードすることをを取っています。

私はルビーの人ではないんだけど、ここにあなたが実際に必要なもので、野生の推測だ:

@signature = OpenSSL::HMAC.hexdigest('sha256', kSigning, @policy) 
+0

感謝。私は別のルートを下り、最終的に自分自身で署名ロジックをコード化しないことにしました – user3895395

0

更新、それは将来的に誰を助け包み、私がAWS-SDKの宝石を使用して終了私のためにすべての署名と書式の建物を扱う。ビュー内の

@s3_base_path = "#{SecureRandom.uuid}/" 
creds = Aws::Credentials.new(access_key_id, secret_access_key, session_token) 
@post = Aws::S3::PresignedPost.new(creds.credentials, AWS_REGION, S3_BRANDING_FILES_BUCKET, { 
    key_starts_with: @s3_base_path, 
    acl: 'private', 
    success_action_status: '201', 
    server_side_encryption: 'AES256', 
    signature_expiration: Time.now.utc + 3600 * 3 
}) 

そして:一見、マイケルを持つため

<!-- Direct Upload to S3 Form --> 
<form action="<%= @post.url %>" method="POST" enctype="multipart/form-data"> 
    <% @post.fields.each do |name, value| %> 
    <input type="hidden" name="<%= name %>" value="<%= value %>"/> 
    <% end %> 

    <!-- Key is the file's name on S3 and will be filled in with JS --> 
    <input type="hidden" name="key" value=""> 
    <div class="hiddenfile" style="height:0; width:0; overflow:hidden;"> 
    <input type="file" accept="image/gif, image/jpeg" name="file" id="file-input"> 
    </div> 
</form> 
関連する問題