Hasta ahora, he estado usando librerías para manejar OAuth, pero últimamente he estado profundizando tratando de comprender el proceso de OAuth subyacente. Actualmente, estoy intentando conectar con Tumblr API v2 mediante OAuth 1.0a con este código simple:No se puede obtener el "Token de solicitud" de OAuth mientras se trabaja con la API de Tumblr usando Python
import urllib, urllib2, time, random, hmac, base64, hashlib
def makenonce():
random_number = ''.join(str(random.randint(0, 9)) for _ in range(40))
m = hashlib.md5(str(time.time()) + str(random_number))
return m.hexdigest()
def encodeparams(s):
return urllib.quote(str(s), safe='~')
# Actual key and secret from a test app created using a dummy Tumblr account
consumer_key = '97oAujQhSaQNv4XDXzCjdZlOxwNyhobmDwmueJBCHWsFFsW7Ly'
consumer_secret = '5q1dpF659SOgSUb0Eo52aAyoud8N8QOuJu6enCG92aDR6WoMlf'
#oauth URLs
request_tokenURL = 'http://www.tumblr.com/oauth/request_token'
#oauth params
oauth_parameters = {
'oauth_consumer_key' : consumer_key,
'oauth_nonce' : makenonce(),
'oauth_timestamp' : str(int(time.time())),
'oauth_signature_method' : "HMAC-SHA1",
'oauth_version' : "1.0"
}
normalized_parameters = encodeparams('&'.join(['%s=%s' % (encodeparams(str(k)), encodeparams(str(oauth_parameters[k]))) for k in sorted(oauth_parameters)]))
# Since I'm focusing only on getting the request token for now, I set this to POST.
normalized_http_method = 'POST'
normalized_http_url = encodeparams(request_tokenURL)
signature_base_string = '&'.join([normalized_http_method, normalized_http_url, normalized_parameters])
oauth_key = consumer_secret + '&'
hashed = hmac.new(oauth_key, signature_base_string, hashlib.sha1)
oauth_parameters['oauth_signature'] = base64.b64encode(hashed.digest())
oauth_header = 'Authorization: OAuth realm="http://www.tumblr.com",' + 'oauth_nonce="' + oauth_parameters['oauth_nonce'] + '",' + 'oauth_timestamp="' + oauth_parameters['oauth_timestamp'] + '",' + 'oauth_consumer_key="' + oauth_parameters['oauth_consumer_key'] + '",' + 'oauth_signature_method="HMAC-SHA1",oauth_version="1.0",oauth_signature="' + oauth_parameters['oauth_signature'] +'"'
# sample oauth_header generated by the code above:
# Authorization: OAuth realm="http://www.tumblr.com",oauth_nonce="c200a0e06f30b84b851ac3e99a71054b",oauth_timestamp="1315231855",oauth_consumer_key="97oAujQhSaQNv4XDXzCjdZlOxwNyhobmDwmueJBCHWsFFsW7Ly",oauth_signature_method="HMAC-SHA1",oauth_version="1.0",oauth_signature="kVAlmwolCX0WJIvTF9MB2UV5rnU="
req = urllib2.Request(request_tokenURL)
req.add_header('Authorization', oauth_header)
# If all goes well, Tumblr should send me the oauth request token.
print urllib2.urlopen(req).read()
En lugar de la solicitud de token OAuth, Tumblr vuelve Error HTTP 401: no autorizado.
cosas que he intentado sin éxito:
- Cambiado
oauth_version
de "1.0" a "1.0a", y lo cambió de nuevo. - Una guía sobre OAuth ordena agregar el '&' al final de
consumer_secret
para obtener eloauth_key
. Traté de eliminar el '&' más adelante para ver si eso hacía alguna diferencia. - Comprobado si los parámetros de OAuth fueron ordenados, y lo fueron.
- No agregó la cadena "Autorización:" al
oauth_header
, y luego la volvió a agregar más tarde. Ninguno hizo ninguna diferencia.
¿Dónde me he equivocado?
Probablemente no deba tener su clave secreta aquí –
@Cal Es una aplicación ficticia hecha específicamente para esta pregunta. Está justo ahí en los comentarios: '// Clave real y secreto de una aplicación de prueba creada con una ** cuenta Tumblr ** ficticia". – vjk2005