2011-09-05 18 views
5

Ho utilizzato le librerie per gestire OAuth finora, ma ultimamente sto scavando più a fondo cercando di capire il processo OAuth sottostante. Attualmente, sto cercando di connettersi a Tumblr API v2 tramite OAuth 1.0a con questo semplice codice:Impossibile ottenere il token di richiesta OAuth mentre si lavora con l'API di Tumblr utilizzando 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() 

Invece del OAuth richiesta di token, Tumblr ritorna Errore HTTP 401: non autorizzato.

cose che ho provato senza successo:

  1. Modificato oauth_version da "1.0" a "1.0a", e ha cambiato di nuovo.
  2. Una guida su OAuth ha ordinato di aggiungere "&" alla fine di consumer_secret per ottenere lo oauth_key. Ho provato a rimuovere il '&' in un secondo momento per vedere se ciò ha fatto alcuna differenza.
  3. Controllato se i parametri OAuth sono stati ordinati e lo erano.
  4. Non è stata aggiunta la stringa "Autorizzazione:" a oauth_header, quindi è stata aggiunta in seguito. Nessuno dei due ha fatto alcuna differenza.

Dove ho sbagliato?

+0

Probabilmente non dovresti avere la tua chiave segreta qui –

+0

@Cal È un'app fittizia creata appositamente per questa domanda. È proprio lì nei commenti: // // Chiave effettiva e segreta da un'app di test creata usando un account Tumblr ** fittizio **. – vjk2005

risposta

4

risolto dopo aver fatto solo 2 semplici modifiche nel codice di cui sopra:

  1. normalized_http_method = 'GET' #non POST
  2. oauth_header = 'OAuth realm="http://www...' # La parola "autorizzazione" non è necessaria. L'avevo già detto in precedenza come elencato in "Cose che ho provato senza successo", ma l'errore elencato in (1) mi ha buttato fuori strada. Con (1) risolto, ho potuto vedere come "Autorizzazione" fosse davvero inutile.

L'OAuth richiesta di token Tumblr mi ha mandato quando ho finalmente capito bene: oauth_token=mbRUgyDkPePfkEztiLELMqUl1kyNXEcaTCCwpb7SoXDF9mhiTF&oauth_token_secret=5pXllXGKA8orAaUat1G7ckIfMfYup8juMBAgEELUkeMZoC3pv6&oauth_callback_confirmed=true

Si tratta di un one-time solo token e ho elencato qui solo per per completezza.

+0

Forse dovresti dare un'occhiata a questo: https://github.com/simplegeo/python-oauth2 – DocWiki

Problemi correlati