سؤال

أحاول الحصول على OAUTH مع Google API باستخدام Python. لقد جربت مكتبات OAuth مختلفة مثل OAUTH, OAUTH2 و Djanog-oauth لكن لا يمكنني تشغيله (بما في ذلك الأمثلة المقدمة).

لتصحيح الأخطاء OAUTH ، أستخدم Google's Oauth Playground وقد درست API و ال وثائق OAUTH

مع بعض المكتبات ، أكافح من خلال الحصول على توقيع مناسب ، مع مكتبات أخرى ، أواجه تحويل الرمز المميز إلى رمز رمز معتمد. ما الذي سيساعدني حقًا إذا كان بإمكان شخص ما أن يريني مثالًا عمليًا على واجهة برمجة تطبيقات Google باستخدام إحدى المكتبات المذكورة أعلاه.

تحرير: سؤالي الأولي لم يؤدي إلى أي إجابات ، لذا فقد أضفت الكود الخاص بي. هناك سببان محتملان لهذا الرمز لا يعملان:
1) لا تفوض Google الرمز المميز لطلبي ، ولكن ليس متأكدًا تمامًا من كيفية اكتشاف هذا
2) توقيع رمز الوصول غير صالح ، لكنني أود بعد ذلك أن أعرف أي معلمات OAUTH التي تتوقعها 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
هل كانت مفيدة؟

المحلول

لديّ Oauth يعمل في تطبيق محرك تطبيق Python:

http://github.com/sje397/chess

التطبيق يعمل في:

http://your-move.appspot.com

نصائح أخرى

هذا العمل بالنسبة لي.

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)

هل جربت واجهة برمجة تطبيقات Gdata Python الرسمية؟ إنه يشحن مع عميل Oauth ويخفي تعقيد مكالمات Oauth.http://code.google.com/p/gdata-python-client/

قد يكون هذا هو الجواب.

عند استدعاء OauthgetRequestToken ، تقوم بتوقيع base_string مع المستهلك الخاص بك متبوعًا بـ AN & (ampersand)

عند استدعاء OauthgetAccessToken ، تقوم بتوقيع BASE_STRING مع المستهلك الخاص بك متبوعًا بـ AN & (ampersand) تليها Token_Secret.

يمكنك التوقيع على BASE_STRING باستخدام (consumer_secret + "&") لـ OauthgetRequestToken وستقوم بالتوقيع

http://hueniverse.com/2008/10/beginners-guide-to-oauth-bart-iii-security-architecture/في أساليب النص العادي و HMAC-SHA1 ، فإن السر المشترك هو مزيج من سر المستهلك والسر الرمزي.

تورنادو لديه رمز العمل لجوجل OAUTH. تحقق من ذلك هنا. جوجل مصادقة. لقد استخدمتها وعملت بشكل جيد خارج الصندوق. كل ما عليك فعله هو إخراج الفصل ووضعه بعناية في عرض Django.

PS: Tornado يستخدم وحدة Async للمستخدم للعودة. نظرًا لأنك تستخدم Django ، فأنت بحاجة إلى الاعتماد على بعض المتغيرات لتحديد أن المستخدم قد منح للتو الوصول إلى التطبيق الخاص بك.

IIRC Google Oauth لا تتبع المعيار تمامًا ، أنت لديك لتحديد الخدمة التي تطلبها (انظر إلى الأمثلة المقدمة في مستندات Google) في الطلب كمعلمة إضافية ، أو لن تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top