35 votes

Exemple d'Oauth pour l'API Google en utilisant Python / Django

J'essaie de faire fonctionner Oauth avec l'API Google en utilisant Python. J'ai essayé différentes bibliothèques Oauth telles que oauth , oauth2 y djanog-oauth mais je n'arrive pas à le faire fonctionner (y compris les exemples fournis).

Pour le débogage d'Oauth, j'utilise l'outil Google Terrain de jeu Oauth et j'ai étudié le API y el Documentation sur Oauth

Avec certaines bibliothèques, j'ai du mal à obtenir une signature correcte, avec d'autres bibliothèques, j'ai du mal à convertir le jeton de requête en jeton autorisé. Ce qui m'aiderait vraiment, c'est que quelqu'un puisse me montrer un exemple fonctionnel pour l'API Google en utilisant l'une des bibliothèques mentionnées ci-dessus.

EDIT : Ma question initiale n'a donné lieu à aucune réponse, j'ai donc ajouté mon code. Il y a deux causes possibles pour que ce code ne fonctionne pas :
1) Google n'autorise pas mon jeton de requête, mais je ne sais pas exactement comment le détecter.
2) La signature du jeton d'accès n'est pas valide mais je voudrais savoir quels sont les paramètres oauth attendus par Google car je suis capable de générer une signature correcte dans la première phase.

Ceci est écrit en utilisant oauth2.py et pour Django d'où le 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

6voto

sje397 Points 23619

J'ai OAuth qui fonctionne dans une application App Engine en python :

http://github.com/sje397/Chess

L'application fonctionne à :

http://your-move.appspot.com

5voto

pacifi30 Points 92

Ça marche pour moi.

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)

3voto

Stephane JAIS Points 31

Avez-vous essayé l'api python officielle de gdata ? Elle est livrée avec un client oauth et masque la complexité des appels oauth. http://code.google.com/p/gdata-python-client/

2voto

AlBeebe Points 3273

C'est peut-être la réponse.

Lorsque vous appelez OAuthGetRequestToken, vous signez la base_string avec votre consumer_secret suivi d'un & (esperluette).

Lorsque vous appelez OAuthGetAccessToken, vous signez la base_string avec votre consumer_secret suivi d'un & (esperluette) puis de token_secret.

Vous devez signer la base_string en utilisant (consumer_secret + "&") pour OAuthGetRequestToken et vous signez la base_string en utilisant (consumer_secret + "&" + token_secret) pour OAuthGetAccessToken.

http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iii-security-architecture/ Dans les méthodes PLAINTEXT et HMAC-SHA1, le secret partagé est la combinaison du secret du consommateur et du secret du jeton.

2voto

Yashh Points 11

Tornado a un code fonctionnel pour Google oauth. Consultez-le ici. authentification google . Je l'ai utilisé et ça a plutôt bien fonctionné. Tout ce que vous avez à faire est d'extraire la classe et de la placer soigneusement dans une vue django.

PS : Tornado utilise un module asynchrone pour le retour de l'utilisateur. Puisque vous utilisez django, vous devez compter sur une variable get pour identifier qu'un utilisateur vient de donner accès à votre application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X