google example python django oauth google-api

example - google-api-python-client



Ejemplo de Oauth for Google API usando Python/Django (6)

¿Has probado la api gdata python oficial? Se envía con un cliente oauth y oculta la complejidad de las llamadas de Oauth. http://code.google.com/p/gdata-python-client/

Estoy intentando que Oauth trabaje con la API de Google usando Python. He intentado con diferentes bibliotecas de oauth, como oauth , oauth2 y djanog-oauth pero no puedo hacerlo funcionar (incluidos los ejemplos proporcionados).

Para depurar Oauth utilizo Oauth Playground de Google y he estudiado la API y la documentación de Oauth

Con algunas bibliotecas me cuesta conseguir una firma correcta, con otras bibliotecas me cuesta convertir el token de solicitud en un token autorizado. Lo que realmente me ayudaría si alguien puede mostrarme un ejemplo de trabajo para la API de Google utilizando una de las bibliotecas mencionadas anteriormente.

EDITAR: Mi pregunta inicial no dio ninguna respuesta, así que agregué mi código. Hay dos posibles causas de que este código no funcione:
1) Google no autoriza mi token de solicitud, pero no estoy seguro de cómo detectarlo
2) La firma del token de acceso no es válida, pero me gustaría saber qué parámetros adicionales espera Google, ya que puedo generar una firma adecuada en la primera fase.

Esto está escrito usando oauth2.py y para Django, por lo tanto, el 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


Esta puede ser la respuesta.

Al llamar a OAuthGetRequestToken, usted firma la base_string con su consumer_secret seguido de un & (ampersand)

Al llamar a OAuthGetAccessToken, usted firma la base_string con su consumer_secret seguido de un & (ampersand) seguido de token_secret.

Debería firmar la base_string usando (consumer_secret + "&") para OAuthGetRequestToken y firmaría la base_string usando (consumer_secret + "&" + token_secret) para OAuthGetAccessToken

http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/ En los métodos PLAINTEXT y HMAC-SHA1, el secreto compartido es la combinación del secreto de consumidor y el secreto de testigo .


Este trabajo para mí.

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)


IIRC Google oauth no está siguiendo el estándar, debe especificar qué servicio está solicitando (consulte los ejemplos proporcionados en los documentos de google) en la solicitud como un parámetro adicional, o no funcionará.



Tornado tiene código de trabajo para Google oauth. Compruébalo aquí. google auth . Lo he usado y funcionó bastante bien de la caja. Todo lo que necesitas hacer es sacar la clase y ponerla cuidadosamente en una vista django.

PD: Tornado hace uso del módulo asíncrono para que el usuario regrese. Como está utilizando django, necesita confiar en alguna variable get para identificar que un usuario acaba de otorgar acceso a su aplicación.