«Неверная подпись»: oAuth провайдер с Django-поршнем - PullRequest
0 голосов
/ 29 мая 2010

Я работаю с django-pneon, чтобы попытаться создать API, поддерживающий oAuth.

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

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

Я добавил потребителя в интерфейс администратора поршня с ключом и секретом, для которых в тестовых целях установлено значение "abcd".

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

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

Неверная подпись. Ожидаемая подпись базовая строка: 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 от Piston, где

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

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

Есть идеи?

Обновление:

Если я удаляю тестового потребителя из бэкэнда поршня, возвращаемый ответ правильно устанавливается на «Недопустимый потребитель», поэтому этот поиск работает.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2011

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

>>> 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 = true"

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

0 голосов
/ 30 мая 2010

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

...