2016-07-28 7 views
0

Ich versuche, einen Upload zu S3 mithilfe eines HTML-POST-Formulars zusammen mit einer Upload-Richtlinie durchzuführen, und ich habe Schwierigkeiten, die entsprechende Signatur zu erstellen.Erstellen einer Signatur für AWS-Anfragelogik - SignatureDoesNotMatch abrufen

Ich bekomme immer eine Antwort 403 und SignatureDoesNotMatch zurück, wenn ich das Upload-Formular absende.

Mit diesem als Führer, http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-UsingHTTPPOST.html Ich habe mit dem folgenden kommen:

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) 
) 

Und ich bin auch die Politik und die Unterschrift in dem von. Ich weiß, dass AWS_REGION und @secret_access_key korrekt sind, weil ich sie an anderer Stelle verwende.

Kann jemand etwas mit dem obigen Code falsch sehen? oder hat eine andere Anleitung?

Antwort

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

Sie nehmen, was Ihre Unterschrift sein sollte und statt hex-kodierenden es, bist du es mit SHA256 und Hex-Codierung des Hash-Hashing.

Ich bin kein Rubin Person, aber hier ist eine wilde Vermutung auf, was Sie wirklich brauchen:

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

Dank für Hinschauen, Michael. Ich entschied mich, eine andere Route einzuschlagen und am Ende nicht selbst die Signaturlogik zu codieren – user3895395

0

Ein Update einhüllen es jemand in der Zukunft hilft, landete ich die aws-sdk Juwel mit bis zu Ich kümmere mich um das Signieren und Erstellen von Formularen.

@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 
}) 

Und dann in der Ansicht:

<!-- 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>