2013-05-17 23 views
9

stavo attraversando l'API Amazon pubblicità del prodotto REST signature docs e sono rimasto bloccato al # 8Calcolare un RFC 2104-compliant HMAC con l'algoritmo SHA256 hash in Ruby

Calcolare un RFC 2104-compliant HMAC con l'SHA256 algoritmo di hash che utilizza la stringa precedente con la nostra chiave di accesso segreta "fittizia": 1234567890. Per ulteriori informazioni su questo passaggio, consultare la documentazione e gli esempi di codice per il linguaggio di programmazione.

Nevermind, è riuscito a farlo ancora una volta con l'aiuto di Calculating a SHA hash with a string + secret key in python. Pubblicheremo la risposta qui sotto.

risposta

15

Di seguito crea la firma corretta:

require 'openssl' 

secret_key = '1234567890' 
query = 'AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06' 
data = ['GET', 'ecs.amazonaws.com', '/onca/xml', query].join("\n") 
sha256 = OpenSSL::Digest::SHA256.new 
sig = OpenSSL::HMAC.digest(sha256, secret_key, data) 
signature = Base64.encode64(sig) 
+0

Oh Glob Yr il migliore! – gr8scott06

+0

L'URL webservices.amazon.com è stato modificato in ecs.amazonaws.com ed è necessario aggiornarlo per generare una firma valida. – OskarH

+0

@HippieBandJam presumo tu intenda solo l'url, ma ti dispiacerebbe modificare la mia risposta? – AJcodez

2

Aggiungendo a AJcodez risposta:

vorrei fare:

... 
signature_raw = Base64.strict_encode64(sig) 
signature  = CGI::escape(signature_raw) 

encode64 aggiunge una nuova riga alla fine, strict_encode64() non lo fa.

https://stackoverflow.com/a/2621023/2760406

Amazon vuole che tu "URL codifica il segno più (+) e uguale (=) personaggi nella firma" # 9 - non funzionerà ora se non lo fanno.

http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html#rest_detailedexample