2010-12-02 6 views
2

Lorsque vous essayez d'authentifier via OAuth dans Django à piston, l'exception suivante est levée:Demander Token par Django piston Lancers TypeError Exception

Environment: 

Request Method: GET 
Request URL: http://localhost:8000/api/oauth/request_token/?oauth_nonce=32921052&oauth_timestamp=1291331173&oauth_consumer_key=ghof7av2vu8hal2hek&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_signature= 
Python Version: 


Traceback: 
File "/Users/derek/.virtualenvs/optimal-rest/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "/Users/derek/.virtualenvs/optimal-rest/lib/python2.7/site-packages/piston/authentication.py" in oauth_request_token 
    130.   token = oauth_server.fetch_request_token(oauth_request) 
File "/Users/derek/.virtualenvs/optimal-rest/lib/python2.7/site-packages/piston/oauth.py" in fetch_request_token 
    302.    self._check_signature(oauth_request, consumer, None) 
File "/Users/derek/.virtualenvs/optimal-rest/lib/python2.7/site-packages/piston/oauth.py" in _check_signature 
    393.   valid_sig = signature_method.check_signature(oauth_request, consumer, token, signature) 
File "/Users/derek/.virtualenvs/optimal-rest/lib/python2.7/site-packages/piston/oauth.py" in check_signature 
    482.   built = self.build_signature(oauth_request, consumer, token) 
File "/Users/derek/.virtualenvs/optimal-rest/lib/python2.7/site-packages/piston/oauth.py" in build_signature 
    513.    hashed = hmac.new(key, raw, sha) 
File "/usr/local/Cellar/python/2.7/lib/python2.7/hmac.py" in new 
    133.  return HMAC(key, msg, digestmod) 
File "/usr/local/Cellar/python/2.7/lib/python2.7/hmac.py" in __init__ 
    72.   self.outer.update(key.translate(trans_5C)) 

Exception Type: TypeError at /api/oauth/request_token/?oauth_nonce=32921052&oauth_timestamp=1291331173&oauth_consumer_key=ghof7av2vu8hal2hek&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_signature= 
Exception Value: character mapping must return integer, None or unicode 

ne peut pas dire si elle est un bug dans le piston ou si je ne peux pas utilise la librairie oauth2.

Code de la consommation:

import os 
import cgi 
import oauth2 as oauth 

# settings for the local test consumer 
CONSUMER_SERVER = os.environ.get("CONSUMER_SERVER") or 'localhost' 
CONSUMER_PORT = os.environ.get("CONSUMER_PORT") or '8000' 
print CONSUMER_SERVER , CONSUMER_PORT 

# fake urls for the test server (matches ones in server.py) 
REQUEST_TOKEN_URL = 'http://%s:%s/api/oauth/request_token/' % (CONSUMER_SERVER, CONSUMER_PORT) 
ACCESS_TOKEN_URL = 'http://%s:%s/api/oauth/access_token/' % (CONSUMER_SERVER, CONSUMER_PORT) 
AUTHORIZE_URL = 'http://%s:%s/api/oauth/authorize/' % (CONSUMER_SERVER, CONSUMER_PORT) 

# key and secret granted by the service provider for this consumer application - same as the MockOAuthDataStore 
CONSUMER_KEY = 'ghof7av2vu8hal2hek' 
CONSUMER_SECRET = 'ohhey' 

consumer = oauth.Consumer(CONSUMER_KEY, CONSUMER_SECRET) 
client = oauth.Client(consumer) 

# Step 1: Get a request token. This is a temporary token that is used for 
# having the user authorize an access token and to sign the request to obtain 
# said access token. 

resp, content = client.request(REQUEST_TOKEN_URL, "GET") 
if resp['status'] != '200': 
    raise Exception("Invalid response %s." % resp['status']) 

Référencer https://github.com/clemesha/django-piston-oauth-example pour le code de la consommation.

+0

Je suis en cours d'exécution dans le même problème, Avez-vous trouvé une solution? – nbarraille

Répondre

3

Il s'agit d'un problème de piston qui provient d'un problème de codage de la clé/secret du consommateur. La solution consiste à forcer le codage de la clé/du secret renvoyé par la base de données vers ASCII.

Dans le fichier store.py du piston, modifiez le lookup_consumer donc ressembler à ceci:

def lookup_consumer(self, key): 
    try: 
     self.consumer = Consumer.objects.get(key=key) 
     self.consumer.key = self.consumer.key.encode('ascii') 
     self.consumer.secret = self.consumer.secret.encode('ascii') 
     return self.consumer 
    except Consumer.DoesNotExist: 
     return None 

Here est ma fourchette de django-piston résolution de ce problème.

+0

Bonne trouvaille. Merci! –

1

Ce problème survient également dans la méthode "build_signature()" du module "oauth.py" si une valeur de clé Unicode est transmise. J'ai découvert ce problème en utilisant le code client clemesha/django-piston-oauth-example mentionné ci-dessus parce qu'il a échoué après l'invite pour le "code PIN".

Le problème sous-jacent est documenté en question # 169 ici: https://bitbucket.org/jespern/django-piston/issue/169/oauth-request-token-error-with-hmac

La solution réencodage décrit ci-dessus est également applicable dans ce cas:

def build_signature(self, oauth_request, consumer, token): 
    """Builds the base signature string.""" 
    key, raw = self.build_signature_base_string(oauth_request, consumer, 
     token) 

    #BUG: character mapping must return integer, None or unicode 
    #FIX: 
    key = key.encode('ascii') 

    # HMAC object. 
    try: 
     import hashlib # 2.5 
     hashed = hmac.new(key, raw, hashlib.sha1) 
    except: 
     import sha # Deprecated 
     hashed = hmac.new(key, raw, sha) 

    # Calculate the digest base 64. 
    return binascii.b2a_base64(hashed.digest())[:-1] 
Questions connexes