2011-09-05 4 views
5

का उपयोग करते हुए टंबल एपीआई के साथ काम करते समय ओएथ "अनुरोध टोकन" प्राप्त करने में असमर्थ, मैं अब तक ओएथ को संभालने के लिए पुस्तकालयों का उपयोग कर रहा हूं, लेकिन हाल ही में मैं अंतर्निहित ओथ प्रक्रिया को समझने की गहरी कोशिश कर रहा हूं। वर्तमान में, मैं इस सरल कोड के साथ OAuth 1.0a का उपयोग कर Tumblr API v2 से कनेक्ट करने के कोशिश कर रहा हूँ:पायथन

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() 
OAuth अनुरोध टोकन के बजाय

, Tumblr रिटर्न HTTP त्रुटि 401: अनधिकृत

चीजें मैं किसी भी सफलता के बिना की कोशिश की है:

  1. "1.0" के लिए "1.0a" में बदल गया oauth_version, और फिर से वापस बदल दिया।
  2. oauth_key प्राप्त करने के लिए consumer_secret के अंत में '' को जोड़ने के लिए ओएथ पर एक मार्गदर्शिका अनिवार्य है। मैंने यह देखने के लिए बाद में '&' को हटाने का प्रयास किया कि क्या इससे कोई फर्क पड़ता है।
  3. जांच की गई कि OAuth पैरामीटर सॉर्ट किए गए थे, और वे थे।
  4. स्ट्रिंग "प्रमाणीकरण:" को oauth_header में नहीं जोड़ा गया, फिर इसे बाद में जोड़ा गया। न तो कोई फर्क पड़ता है।

मैं गलत कहां गया हूं?

+0

शायद आपके पास –

+0

@Cal पर आपकी गुप्त कुंजी नहीं होनी चाहिए, यह विशेष रूप से इस प्रश्न के लिए बनाई गई एक डमी ऐप है। टिप्पणियों में यह ठीक है: // // ** डमी ** टंबल खाता 'का उपयोग करके बनाई गई एक परीक्षण ऐप से वास्तविक कुंजी और रहस्य। – vjk2005

उत्तर

4

उपरोक्त कोड में सिर्फ 2 सरल परिवर्तन करने के बाद यह हल:

  1. normalized_http_method = 'GET' पोस्ट
  2. oauth_header = 'OAuth realm="http://www...' # #not शब्द "प्राधिकरण" अनावश्यक है। मैंने इसे पहले "किसी भी सफलता के बिना कोशिश की है" में सूचीबद्ध के रूप में लिया था, लेकिन (1) में सूचीबद्ध त्रुटि ने मुझे ट्रैक बंद कर दिया। (1) हल के साथ, मैं देख सकता था कि कैसे "प्राधिकरण" वास्तव में अनावश्यक था।

OAuth अनुरोध टोकन Tumblr मुझे भेजा जब मैं अंत में यह अधिकार मिल गया: ↑ oauth_token=mbRUgyDkPePfkEztiLELMqUl1kyNXEcaTCCwpb7SoXDF9mhiTF&oauth_token_secret=5pXllXGKA8orAaUat1G7ckIfMfYup8juMBAgEELUkeMZoC3pv6&oauth_callback_confirmed=true

यह एक बार की ही निशानी है और मैं इसे यहाँ बस के लिए सूचीबद्ध किया है पूर्णता के लिए।

+0

शायद आपको इसे देखना चाहिए: https://github.com/simplegeo/python-oauth2 – DocWiki

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^