2010-05-29 6 views
0

Je travaille avec django-piston pour tenter de créer une API qui prend en charge oAuth."Signature non valide": fournisseur oAuth avec Django-piston

j'ai commencé à l'aide du didacticiel à:

http://blog.carduner.net/2010/01/26/django-piston-and-oauth/

J'ai ajouté un consommateur à l'interface d'administration de piston avec clé et secret à la fois réglé sur « ABCD » à des fins de test.

Les urls sont câblés avec succès, et le fournisseur OAuth est appelé.

Toutefois, l'exécution de mes obtenir des tests de jeton de demande avec TripIt (python get_request_token.py "http://127.0.0.1:8000/api" ABCD), je reçois l'erreur suivante:

Invalid signature. Expected signature base string: GET&http%3A%2F%2F127.0.0.1%3A8000%2Fapi%2Foauth%2Frequest_token%2F&oauth_consumer_key%3Dabcd%26oauth_nonce%3D0c0bdded5b1afb8eddf94f7ccc672658%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1275135410%26oauth_version%3D1.0

Le problème semble résider dans la méthode de _check_signature de ce piston oauth.py, où

valid_sig = signature_method.check_signature(oauth_request, consumer, token, signature) 

renvoie false. Cependant, je ne peux pas déterminer comment valider la signature.

Des idées?

Mise à jour:

Si je retire le consommateur de test à partir du backend de piston, la réponse est retourné correctement réglé sur « consommateur non valide », cette recherche semble fonctionner.

Répondre

0

La réponse finale, j'ai trouvé était d'installer une copie de travail de oauth_consumer dans le répertoire de l'application. Une fois que j'ai ajouté mon client dans cette application, tout a fonctionné comme prévu.

+0

... de plus, un autre problème était une différence entre un "/" requis à la fin de l'URL; l'extra% 2F dans la requête invalide la signature. –

0

@ Ricardo et toute autre personne ayant des problèmes avec cette erreur (désolé pour la "réponse", je n'ai pas encore commenté), j'ai pu éviter cette erreur en générant ma signature en suivant les cas de test fournis dans le code du piston. Exemple:

>>> from piston.oauth import * 
>>> from piston.models import * 
>>> consumer = Consumer.objects.get(id=1) 
>>> oaconsumer = OAuthConsumer(consumer.key, consumer.secret) 
>>> request = OAuthRequest.from_consumer_and_token(oaconsumer, http_url='http: 
    //localhost:8000/api/oauth/request_token/') 
>>> signature_method = OAuthSignatureMethod_HMAC_SHA1() 
>>> request.sign_request(signature_method, oaconsumer, None) 
>>> request.sign_request(signature_method, oaconsumer, None) 
>>> request.parameters 
{'oauth_nonce': '64379482', 'oauth_timestamp': 1297147940, 'oauth_consumer_key': u'8aZSFj3W54h8J8sCpx', 'oauth_signature_method': 'HMAC-SHA1', 'oauth_version': '1.0', 'oauth_signature': 'kGSLCZjYzAHXsa8f9sL52Kq1F2w='} 

De là, il suffit d'utiliser ces paramètres dans un navigateur, par exemple. http://localhost:8000/api/oauth/request_token/?oauth_nonce=64379482&oauth_timestamp=1297147940&oauth_consumer_key=8aZSFj3W54h8J8sCpx&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_signature=kGSLCZjYzAHXsa8f9sL52Kq1F2w=

qui génère "oauth_token_secret = 37VZKRV3fXRLAw5tekZD2bwnMhXqGwgx & oauth_token = LRnexBGTNC4nDXpv9M & oauth_callback_confirmed = true"

Comme Martin a fait remarquer, en laissant un "/" soit dans l'exemple de code ou l'URL rendre la signature « invalide ".

Questions connexes