2010-05-29 6 views
0

Я работаю с django-piston, чтобы попытаться создать API, который поддерживает oAuth.«Недопустимая подпись»: поставщик oAuth с Django-piston

Я начал с использованием учебника по адресу:

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

Я добавил потребитель к интерфейсу администратора поршня с ключом и секретом, как установлено в «ABCD» для целей тестирования.

URL-адреса успешно подключены к сети и вызывается провайдер OAuth.

Однако выполнение моих тестов запросов маркеров получить с Tripit (питона get_request_token.py «http://127.0.0.1:8000/api» ABCD ABCD), я получаю следующее сообщение об ошибке:

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

Проблема, кажется, лежит внутри метода _check_signature от поршня oauth.py, где

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

возвращает false. Однако я не могу понять, как получить подпись, подтвержденную.

Любые идеи?

Update:

Если удалить тест потребителя от бэкэндом поршня, ответ возвращается правильно установлен на «Invalid потребитель», так это поиск, кажется, работает.

ответ

0

Возможный ответ, который я нашел, - установить рабочую копию oauth_consumer в каталог приложения. Как только я добавил своего потребителя в это приложение, все работало так, как ожидалось.

+0

... еще одна проблема заключалась в расхождении между требуемым «/» в конце URL-адреса; дополнительный% 2F в запросе аннулирует подпись. –

0

@ Ricardo и все остальные проблемы с этой ошибкой (извините за «ответ», у меня пока нет комментариев), я смог избежать этой ошибки, создав свою подпись из следующих тестовых случаев в поршневом коде. Пример:

>>> 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='} 

Здесь просто используйте эти параметры в браузере, например. 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=

, который генерирует "oauth_token_secret = 37VZKRV3fXRLAw5tekZD2bwnMhXqGwgx & oauth_token = LRnexBGTNC4nDXpv9M & oauth_callback_confirmed = истина"

Как Мартин отметил, оставляя на "/" в любом образце кода или URL будет воспроизводить подпись «недействителен ».