Проблема с OAuth, POST с параметрами - PullRequest
3 голосов
/ 25 января 2011

Я использую OAuth-библиотеку Objective-C с открытым исходным кодом Джона Кросби http://code.google.com/p/oauthconsumer/ для некоторой базовой http-аутентификации, которая не имеет дело с токенами, только ключом пользователя и секретом пользователя.Мой код прекрасно работает для GET, GET с параметрами в URL и POST.Однако когда я выполняю запрос POST с параметрами в URL-адресе, авторизация не проходит.Я пытаюсь понять, почему.

Сервер использует Apache Commons OAuth, поэтому я хотел бы сравнить мою базовую строку с этой библиотекой.Вот надуманный пример и базовая строка и подпись, созданные моей библиотекой.Кто-нибудь может увидеть, в чем проблема?

consumer key:    abcdef
consumer secret: ghijkl
POST request:    http://emptyrandomhost.com/a/uriwith/params?interesting=foo&prolific=bar
my base string:  POST&http%3A%2F%2Femptyrandomhost.com%2Fa%2Furiwith%2Fparams&interesting%3Dfoo%26oauth_consumer_key%3Dabcdef%26oauth_nonce%3D1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D2%26oauth_version%3D1.0%26prolific%3Dbar

Эти данные дают следующую авторизацию заголовка OAuth:

Authorization: OAuth oauth_consumer_key="abcdef", 
                     oauth_version="1.0", 
                     oauth_signature_method="HMAC-SHA1", 
                     oauth_timestamp="2", 
                     oauth_nonce="1", 
                     oauth_signature="Z0PVIz5Lo4eB7aZFT8FE3%2FFlbz0%3D"

И, очевидно, моя подпись неверна.Проблема должна заключаться либо в построении базовой строки, в способе реализации функции HMAC-SHA1 (с использованием Apple CCHmac из CommonHMAC.h, так что, надеюсь, это не так), либо в моем Base64Transcoder, которыйс открытым исходным кодом c.2003 Джонатан Уайт / Toxic Software.Я в первую очередь подозреваю базовую строку, так как запросы работают для GET и POST и терпят неудачу только с POST с параметрами URL, как указано выше.

Может ли кто-то с большим опытом работы с OAuth определить вышеописанную проблему?Еще одна полезная вещь - это базовая строка, которая создается Apache Commons OAuth при их аутентификации.Спасибо.

Ответы [ 2 ]

4 голосов
/ 25 января 2011

Согласно RFC 5849, раздел 3.4.1.2 , URI базовой строки OAuth не включает строку запроса или фрагмент. Если клиент или сервер не удаляют параметры запроса из URI базовой строки и не добавляют их в нормализованный список параметров OAuth, подписи не будут совпадать. К сожалению, сложно сказать, какая сторона совершает эту ошибку. Но легко определить, что это проблема: если он всегда работает без параметров запроса, но всегда терпит неудачу с параметрами запроса, вы можете быть совершенно уверены, что одна или другая сторона генерирует неправильную базовую строку. (Убедитесь, что это всегда случается, хотя ... случайные ошибки могут быть чем-то другим. Точно так же, если это никогда не работает со строкой запроса или без нее, это также будет чем-то другим.) Другая возможность состоит в том, что нормализация была выполнена неправильно - список параметров должен быть отсортирован, а последовательности в процентах должны быть прописными. Если он не нормализован правильно с обеих сторон, это также приведет к несоответствию базовой строки и, таким образом, к несоответствию сигнатур.

2 голосов
/ 25 января 2011

Вы можете создать и проверить свой запрос по этому адресу:

http://hueniverse.com/2008/10/beginners-guide-to-oauth-part-iv-signing-requests/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...