OAUTH لمثال Google API باستخدام Python / Django
-
21-09-2019 - |
سؤال
أحاول الحصول على 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
المحلول
نصائح أخرى
هذا العمل بالنسبة لي.
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) في الطلب كمعلمة إضافية ، أو لن تعمل.