2010-02-17 17 views
35

का उपयोग कर Google एपीआई उदाहरण के लिए ओथ, मैं ओथ को पाइथन का उपयोग करके Google एपीआई के साथ काम करने की कोशिश कर रहा हूं। मैंने विभिन्न oauth पुस्तकालयों जैसे oauth, oauth2 और djanog-oauth की कोशिश की है, लेकिन मैं इसे काम करने के लिए नहीं मिला (प्रदान किए गए उदाहरणों सहित)।पायथॉन/डीजेगो

Oauth डिबगिंग के लिए मैं गूगल के Oauth Playground का उपयोग करें और मैं API और Oauth documentation

कुछ पुस्तकालयों मैं एक सही हस्ताक्षर हो रही के साथ संघर्ष कर रहा हूँ के साथ

का अध्ययन किया है, अन्य पुस्तकालयों मैं एक अधिकृत करने के लिए अनुरोध टोकन परिवर्तित करने के साथ संघर्ष कर रहा हूँ के साथ टोकन। अगर कोई मुझे ऊपर बताए गए पुस्तकालयों में से किसी एक का उपयोग करके Google एपीआई के लिए एक कामकाजी उदाहरण दिखा सकता है तो वास्तव में मेरी क्या मदद करेगा।

संपादित करें: मेरा प्रारंभिक प्रश्न किसी भी उत्तर का कारण नहीं बनता है इसलिए मैंने अपना कोड जोड़ा है। इस कोड के दो संभावित कारण काम नहीं कर रहे हैं:
1) Google मेरे अनुरोध टोकन को अधिकृत नहीं करता है, लेकिन यह सुनिश्चित नहीं है कि इस
2 का पता कैसे लगाएं) एक्सेस टोकन के लिए यह हस्ताक्षर अमान्य है लेकिन फिर मैं जानना चाहता हूं कौन सा ओथ पैरामीटर Google उम्मीद कर रहा है क्योंकि मैं पहले चरण में उचित हस्ताक्षर उत्पन्न करने में सक्षम हूं।

यह oauth2.py और Django के लिए लिखा जाता है इसलिए HttpResponseRedirect।

REQUEST_TOKEN_URL = 'https://www.google.com/accounts/OAuthGetRequestToken' 
AUTHORIZATION_URL = 'https://www.google.com/accounts/OAuthAuthorizeToken' 
ACCESS_TOKEN_URL = 'https://www.google.com/accounts/OAuthGetAccessToken' 

CALLBACK = 'http://localhost:8000/mappr/mappr/oauth/' #will become real server when deployed 

OAUTH_CONSUMER_KEY = 'anonymous' 
OAUTH_CONSUMER_SECRET = 'anonymous' 

signature_method = oauth.SignatureMethod_HMAC_SHA1() 
consumer = oauth.Consumer(key=OAUTH_CONSUMER_KEY, secret=OAUTH_CONSUMER_SECRET) 
client = oauth.Client(consumer) 

request_token = oauth.Token('','') #hackish way to be able to access the token in different functions, I know this is bad, but I just want it to get working in the first place :) 

def authorize(request): 
    if request.GET == {}: 
     tokens = OAuthGetRequestToken() 
     return HttpResponseRedirect(AUTHORIZATION_URL + '?' + tokens) 
    elif request.GET['oauth_verifier'] != '': 
     oauth_token = request.GET['oauth_token'] 
     oauth_verifier = request.GET['oauth_verifier'] 
     OAuthAuthorizeToken(oauth_token) 
     OAuthGetAccessToken(oauth_token, oauth_verifier) 
     #I need to add a Django return object but I am still debugging other phases. 

def OAuthGetRequestToken(): 
    print '*** OUTPUT OAuthGetRequestToken ***' 
    params = { 
    'oauth_consumer_key': OAUTH_CONSUMER_KEY, 
    'oauth_nonce': oauth.generate_nonce(), 
    'oauth_signature_method': 'HMAC-SHA1', 
    'oauth_timestamp': int(time.time()), #The timestamp should be expressed in number of seconds after January 1, 1970 00:00:00 GMT. 
    'scope': 'https://www.google.com/analytics/feeds/', 
    'oauth_callback': CALLBACK, 
    'oauth_version': '1.0' 
    } 

    # Sign the request. 
    req = oauth.Request(method="GET", url=REQUEST_TOKEN_URL, parameters=params) 
    req.sign_request(signature_method, consumer, None) 

    tokens =client.request(req.to_url())[1] 
    params = ConvertURLParamstoDictionary(tokens) 
    request_token.key = params['oauth_token'] 
    request_token.secret = params['oauth_token_secret'] 
    return tokens 

def OAuthAuthorizeToken(oauth_token): 
    print '*** OUTPUT OAuthAuthorizeToken ***' 
    params ={ 
    'oauth_token' :oauth_token, 
    'hd': 'default' 
    } 
    req = oauth.Request(method="GET", url=AUTHORIZATION_URL, parameters=params) 
    req.sign_request(signature_method, consumer, request_token) 
    response =client.request(req.to_url()) 
    print response #for debugging purposes 

def OAuthGetAccessToken(oauth_token, oauth_verifier): 
    print '*** OUTPUT OAuthGetAccessToken ***' 
    params = { 
    'oauth_consumer_key': OAUTH_CONSUMER_KEY, 
    'oauth_token': oauth_token, 
    'oauth_verifier': oauth_verifier, 
    'oauth_token_secret': request_token.secret, 
    'oauth_signature_method': 'HMAC-SHA1', 
    'oauth_timestamp': int(time.time()), 
    'oauth_nonce': oauth.generate_nonce(), 
    'oauth_version': '1.0',  
    } 

    req = oauth.Request(method="GET", url=ACCESS_TOKEN_URL, parameters=params) 
    req.sign_request(signature_method, consumer, request_token) 

    response =client.request(req.to_url()) 
    print response 
    return req 

def ConvertURLParamstoDictionary(tokens): 
    params = {} 
    tokens = tokens.split('&') 
    for token in tokens: 
     token = token.split('=') 
     params[token[0]] = token[1] 

    return params 

उत्तर

2

यह उत्तर हो सकता है।

जब बुला OAuthGetRequestToken आप अपने consumer_secret एक & (एम्परसेंड) द्वारा पीछा के साथ base_string हस्ताक्षर

जब बुला OAuthGetAccessToken आप अपने consumer_secret एक & (एम्परसेंड) द्वारा पीछा किया token_secret द्वारा पीछा के साथ base_string करें।

आप OAuthGetRequestToken के लिए (consumer_secret + "&") और का उपयोग कर base_string हस्ताक्षर करेंगे आप OAuthGetAccessToken

http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/ के लिए (consumer_secret + "&" + token_secret) का उपयोग कर प्लेन में base_string पर हस्ताक्षर करेंगे और एचएमएसी-एसएचए 1 विधियों, साझा रहस्य उपभोक्ता गुप्त और टोकन गुप्त का संयोजन है।

+0

धन्यवाद !!! यह मेरा दिन बचाओ !!! – VHanded

3

क्या आपने आधिकारिक gdata पायथन एपीआई की कोशिश की है? यह एक ओथ क्लाइंट के साथ जहाज करता है और ओथ कॉल की जटिलता को छुपाता है। http://code.google.com/p/gdata-python-client/

0

IIRC गूगल OAuth काफी मानक का पालन नहीं कर रहा है, तो आप क्या सेवा आप एक अतिरिक्त पैरामीटर के रूप में अनुरोध में (गूगल डॉक्स में दिए गए उदाहरणों को देखने) के लिए अनुरोध कर रहे हैं निर्दिष्ट करने के लिए है , या यह काम नहीं करेगा

2

टॉरनाडो के पास Google oauth के लिए कोड कोड है। यहां इसकी जांच कीजिए। google auth। मैंने इसका इस्तेमाल किया है और बॉक्स से काफी अच्छा काम किया है। आपको बस इतना करना है कि कक्षा को बाहर निकालें और ध्यान से इसे डीजेंगो व्यू में डालें।

पीएस: टॉरनाडो उपयोगकर्ता के लौटने के लिए एसिंक मॉड्यूल का उपयोग करता है। चूंकि आप django का उपयोग कर रहे हैं, इसलिए आपको यह पहचानने के लिए कुछ प्राप्त चर पर भरोसा करना होगा कि किसी उपयोगकर्ता ने अभी आपके एप्लिकेशन तक पहुंच प्रदान की है।

+0

यह उदाहरण केवल Google+ API बैकएंड कोड का उपयोग करता है या यह एक मिश्रण या क्लाइंट और बैकएंड दोनों है? –

4

मेरे लिए यह काम करते हैं।

def login(request): 
    consumer_key = 'blabla' 
    consumer_secret = 'blabla' 
    callback = request.GET['callback'] 
    request_token_url = 'https://api.linkedin.com/uas/oauth/requestToken' 
    authorize_url =  'https://api.linkedin.com/uas/oauth/authorize' 
    access_token_url = 'https://api.linkedin.com/uas/oauth/accessToken' 
    consumer = oauth.Consumer(consumer_key, consumer_secret) 

    if ('oauth_verifier' not in request.GET): 
     client = oauth.Client(consumer) 
     body = 'oauth_callback=http://shofin.com/login?callback='+callback+"&placeId="+request.GET[placeId] 
     resp,content = client.request(request_token_url,"POST",headers={'Content-Type':'application/x-www-form-urlencoded'},body=body) 
     request_token = dict(urlparse.parse_qsl(content)) 
     loginUrl = authorize_url+"?oauth_token="+request_token['oauth_token'] 
     cache.set(request_token['oauth_token'],request_token['oauth_token_secret']) 
     return HttpResponseRedirect(loginUrl) 

    elif request.GET['oauth_verifier']: 
     token = oauth.Token(request.GET['oauth_token'],cache.get(request.GET['oauth_token'])) 
     token.set_verifier(request.GET['oauth_verifier']) 
     client = oauth.Client(consumer, token) 
     resp,content = client.request(access_token_url,"POST",{}) 
     access_token = dict(urlparse.parse_qsl(content)) 
     token = oauth.Token(key=access_token['oauth_token'], secret=access_token['oauth_token_secret']) 

     client = oauth.Client(consumer, token) 
     resp,json = client.request("http://api.linkedin.com/v1/people/~?format=json") 
     return render_to_response(callback,{'placeId':request.GET['placeId'],'userId':userId,'folkId':folkId)