2011-09-05 16 views
5

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:

  1. Cambiado oauth_version de "1.0" a "1.0a", y lo cambió de nuevo.
  2. Una guía sobre OAuth ordena agregar el '&' al final de consumer_secret para obtener el oauth_key. Traté de eliminar el '&' más adelante para ver si eso hacía alguna diferencia.
  3. Comprobado si los parámetros de OAuth fueron ordenados, y lo fueron.
  4. 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?

+0

Probablemente no deba tener su clave secreta aquí –

+0

@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

Respuesta

4

lo resolvió después de hacer sólo 2 simples cambios en el código anterior:

  1. normalized_http_method = 'GET' #no POSTAL
  2. oauth_header = 'OAuth realm="http://www...' # La palabra "Autorización" es innecesaria. Lo había sacado antes como se indica en "Cosas que he intentado sin éxito", pero el error que figura en (1) me desvió. Con (1) resuelto, pude ver cómo la "Autorización" era realmente innecesaria.

La solicitud de token OAuth Tumblr me envió cuando finalmente lo hizo bien: oauth_token=mbRUgyDkPePfkEztiLELMqUl1kyNXEcaTCCwpb7SoXDF9mhiTF&oauth_token_secret=5pXllXGKA8orAaUat1G7ckIfMfYup8juMBAgEELUkeMZoC3pv6&oauth_callback_confirmed=true

Se trata de una sola vez token y que he mencionado aquí sólo para en aras de la compleción.

+0

Quizás deberías echarle un vistazo a esto: https://github.com/simplegeo/python-oauth2 – DocWiki

Cuestiones relacionadas