2014-06-26 34 views
5

Próbuję utworzyć podpisane żądanie HMAC-SHA512 dla wywołania interfejsu API w Pythonie 3.4 przy użyciu biblioteki żądań. Próbuję postępować zgodnie z dokumentami, ale trafiam w ten błąd:Żądania podpisania HMAC w Pythonie

AttributeError: '_hashlib.HASH' object has no attribute 'new' 

Oto kod. Nie działa z błędem konstruktora hmac. Jest w porządku, jeśli próbuję przekazać hashlib.md5() lub całkowicie pominąć parametr digest.

Nie jestem pewien, czy podpisuję wniosek prawidłowo, ponieważ nie mam jeszcze tak daleko. Dokumenty dotyczące usługi, którą próbuję użyć, podpiszą adres URL moim sekretem. Potrzebuję tego, aby był ciągiem bajtowym, aby to działało.

import hmac 
import hashlib 
import requests 

secret = b'mysecret' 
url = b'http://someurl.com/something/' 

signing = hmac.new(secret, url, hashlib.sha512()) 

headers = {'apisign': signing.digest()} 
response = requests.get(url, headers=headers) 

Wszelkie wskazówki są mile widziane. Nie mogłem znaleźć przykładu. Dzięki!

Odpowiedz

11

należy przekazać w odniesieniu do hashlib.sha512 na żądanie, a nie w wyniku nazywając go:

signing = hmac.new(secret, url, hashlib.sha512) 

Alternatywnie, można po prostu użyć ciąg 'sha512':

signing = hmac.new(secret, url, 'sha512') 

i hashlib.new() będzie użyte do skonstruowania obiektu hash.

Demo:

>>> import hashlib 
>>> import hmac 
>>> secret = b'mysecret' 
>>> url = b'http://someurl.com/something/' 
>>> signing = hmac.new(secret, url, hashlib.sha512) 
>>> signing.digest() 
b'!~s2\x97\x97\xa9\xcc\xefcb\xa8\xcc\xa7\xbc\xec\xe5\xfc\xc3\xac\xfc\xbc5]\x05\x96\xc7\x83\x8b\x1b\x90\xd3\xa5\xca\x8cLsC\x17\xa0\xea\xa3\xfe\xd8M\xfda\x1epj\x90\xff}\xfa\[email protected]\x92\xfb\xee\xa8\xab\x1b\x08\x8e' 
+0

Hah, że brakowało. Dzięki! – Ludo