OAuth-аутентификация, неверная подпись - PullRequest
0 голосов
/ 21 марта 2012

Я устал портировать библиотеку request-oauth (на основе python-request ) на Python 3 (с помощью 2to3), но у меня есть проблемы с проверкой подписи с помощью StatusNet(тот же API, что и в Twitter).

Когда я делаю запрос к oauth/request_token, у меня нет проблем, но к oauth/access_token у меня появляется ошибка 401 Invalid signature.Я не понимаю почему, потому что мне кажется, что то, что я подписываю, является правильным.

Например, с кодом Python 2, cf hook.py и auth.py (оригинал из репозитория git), я получаю:

signing_key = '0de1456373dfc9349dd38a48e61fc844&136d6b9a597ee57d4338254812681acd',
signing_raw = 'POST&http%3A%2F%2Fstatus2.dotzero.me%2Fapi%2Foauth%2Faccess_token&oauth_consumer_key%3Dec3ad931b294b51a5ff595c732acb7a5%26oauth_nonce%3D33448267%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1332279747%26oauth_token%3D2131043f3516bcb730d391ed2033a880%26oauth_verifier%3D8816492%26oauth_version%3D1.0'
oauth_hook.token.key = '2131043f3516bcb730d391ed2033a880'
oauth_hook.token.secret = '136d6b9a597ee57d4338254812681acd'
request.data_and_params = {'oauth_version': '1.0', 'oauth_signature': 'xyjxH5QcfZXnG111L7qANZ+ahRI=',
    'oauth_token': '2131043f3516bcb730d391ed2033a880', 'oauth_nonce': '33448267', 
    'oauth_timestamp': '1332279747', 'oauth_verifier': '8816492', 
    'oauth_consumer_key': 'ec3ad931b294b51a5ff595c732acb7a5', 
    'oauth_signature_method': 'HMAC-SHA1'}

и с моим портом Python 3, cf hook.py и auth.py , Я получаю:

signing_key = '0de1456373dfc9349dd38a48e61fc844&136d6b9a597ee57d4338254812681acd',
signing_raw = 'POST&http%3A%2F%2Fstatus2.dotzero.me%2Fapi%2Foauth%2Faccess_token&oauth_consumer_key%3Dec3ad931b294b51a5ff595c732acb7a5%26oauth_nonce%3D52360702%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1332278837%26oauth_token%3D2131043f3516bcb730d391ed2033a880%26oauth_verifier%3D8816492%26oauth_verifier%3D8816492%26oauth_version%3D1.0'
oauth_hook.token.key = '2131043f3516bcb730d391ed2033a880'
oauth_hook.token.secret = '136d6b9a597ee57d4338254812681acd'
request.data_and_params = {'oauth_nonce': '52360702', 'oauth_timestamp': '1332278837', 
    'oauth_verifier': '8816492', 'oauth_consumer_key': 'ec3ad931b294b51a5ff595c732acb7a5', 
    'oauth_signature_method': 'HMAC-SHA1', 'oauth_version': '1.0', 
    'oauth_token': '2131043f3516bcb730d391ed2033a880',
    'oauth_signature': 'BRsb11dk++405uaq5pRS+CMUzbo='}

Оба выглядят хорошо для меня, но первый успешно, а второй возвращает ошибку 401, недопустимая подпись.

В обоих случаях я получаю token.keyи token.secret в результате:

OAuthHook.consumer_key = self.ckey
OAuthHook.consumer_secret = self.csecret
oauth_hook = OAuthHook()
client = requests.session(hooks={'pre_request': oauth_hook})
response = client.post('%soauth/request_token' % (self.url), {'oauth_callback': 'oob'})
# new oauth_hook with the request token
oauth_hook = OAuthHook(response[b'oauth_token'][0],response[b'oauth_token_secret'][0])

Их, я иду на oauth/authorize?oauth_token=%s" % oauth_hook.token.key, чтобы авторизовать приложение и получить пин-код.После этого я могу выполнить проблемный запрос

...
response = client.post('%soauth/request_token' % (self.url), {'oauth_callback': 'oob'})
oauth_hook = OAuthHook(response[b'oauth_token'][0],response[b'oauth_token_secret'][0])
# get the pincode from %soauth/authorize?oauth_token=%s" % (self.url, oauth_hook.token.key)
oauth_hook.token.set_verifier(pincode)
client = requests.session(hooks={'pre_request': oauth_hook})
response = client.post("%soauth/access_token" % (self.url),
                 {'oauth_verifier': pincode})

Код подписи из файла auth.py:

def sign(self, request, consumer, token):
    """Builds the base signature string."""
    key, raw = self.signing_base(request, consumer, token)
    hashed = hmac.new(key.encode(), raw.encode(), sha1)
    # Calculate the digest base 64.
    return binascii.b2a_base64(hashed.digest())[:-1]

Есть идеи, почему он не работает с кодом py3k?

Спасибо

Ответы [ 2 ]

1 голос
/ 09 октября 2015

Возможно, вам потребуется проверить строку заголовка Авторизация в вашем запросе.Обычно это будет формат:

'Авторизация' => 'OAuth realm = "", oauth_timestamp = "1243392158", oauth_nonce = "VsaPHb", oauth_consumer_key = "xxxxxxxxxxxxxxxxxx", oauthtoxxxxxx-xxxx-xxxxxxxxxxxxxx ", oauth_version =" 1.0 ", oauth_signature_method =" HMAC-SHA1 ", oauth_signature =" xxxxxxxxxxxxxxxxxxxx "'

в указанном выше значении заголовка, проверьте, что" "правильно декодируется.То есть он не должен содержать такие значения, как: % 3D .Вы можете использовать этот инструмент для декодирования строки.

Это сработало для меня.Надеюсь, это кому-нибудь поможет.

0 голосов
/ 21 марта 2012

Нашел ответ! В запросе POST было два oauth_verifier, что привело к неправильной подписи ...

...