Ошибка XAuth, когда пароль содержит «#» - PullRequest
1 голос
/ 27 августа 2011

У меня очень странная ошибка с моей реализацией xauth.

Сбой, когда пароль содержит "#".Я выхватил необработанные заголовки, и они выглядят почти так же, как и другое приложение, которое работает, за исключением другого одноразового номера (имеет ли это значение?)

Код, который я использую, находится здесь: http://pastie.org/2436098

--------MY LIBRARY :FAIL--------

POST /oauth/access_token HTTP/1.1
Host: api.twitter.com
User-Agent: onethingaday/1.0 CFNetwork/485.13.8 Darwin/10.7.0
Authorization: OAuth oauth_nonce="70943970", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1314400256", oauth_consumer_key="fmYDyQZ1IRz6sYuhOAQbJQ", oauth_signature="1VYDQYL5WvkbovQggNUjuY9t%2Fvc%3D", oauth_version="1.0"
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 78
Connection: keep-alive
Proxy-Connection: keep-alive

x_auth_mode=client_auth&x_auth_username=kkklllkkk1&x_auth_password=kkkk%23kkkk


--------SNOOPING ANOTHER APP : SUCCESS--------

POST /oauth/access_token HTTP/1.1
Host: api.twitter.com
User-Agent: XAuthTwitterEngineDemo/1.0 CFNetwork/485.13.8 Darwin/10.7.0
Content-Length: 78
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth realm="", oauth_consumer_key="fmYDyQZ1IRz6sYuhOAQbJQ", oauth_signature_method="HMAC-SHA1", oauth_signature="mEyjwksg1NoaY2VMQBf70ZN3OhM%3D", oauth_timestamp="1314400386", oauth_nonce="4DF9C426-08F8-49FC-9E1B-576FDBDA8836", oauth_version="1.0"
Accept: */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive
Proxy-Connection: keep-alive

x_auth_mode=client_auth&x_auth_username=kkklllkkk1&x_auth_password=kkkk%23kkkk

1 Ответ

2 голосов
/ 28 августа 2011

Скорее всего, вы испортили базовую строку подписи. То, как вы строите свои параметры, пытается укорочить и изменить некоторые шаги, и, похоже, отсутствует уровень кодирования. Вы строите список параметров элементов, таких как:

E(k) + E('=') + E(v)

затем сортирует их по объединенной кодированной строке пары ключ-значение, затем объединяет все эти строки, например

P_{i} + E('&') + P_{i + 1}

Это пропускает уровень кодирования для пар, потому что то, что вы должны получить для той части базовой строки сигнатуры, которая соответствует параметрам, на самом деле (для простоты предполагается две пары ключ-значение):

E(E(k) + '=' + E(v) + '&' + E(k2) + '=' + E(v2))
=
E(E(k)) + E('=') + E(E(v)) + E('&') + E(E(k2)) + E('=') + E(E(v2))

Это означает, что знаки % в символах с экранированием процентов клавиш и значений сами по себе экранированы, поэтому # сначала превращается в %23, а затем в %2523, поскольку E('%') = '%25'.

Если вы будете следовать стандартным пошаговым инструкциям, у вас все будет хорошо. Если вы отступите от стандарта без подтверждения эквивалентности, вы, скорее всего, ошибетесь.

...