2011-01-25 3 views
3

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

Сервер использует 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 (с использованием CCHmac от Apple из CommonHMAC.h, так что, надеюсь, это не так) или с моим Base64Transcoder, который с открытым исходным кодом c. 2003 Джонатан Уайт/Toxic Software. Я в первую очередь подозреваю базовую строку, поскольку запросы работают для GET и POST и только с ошибкой POST с параметрами URL, как указано выше.

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

+1

Попробуйте определить константы для этих ключей. Это поможет устранить опечатки и упростить изменение ключей в случае необходимости. – Moshe

ответ

2

вы можете построить и проверить визуально ваш запрос по этому адресу:

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

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

+1

Этот сайт помог мне с легкостью выявить проблему с моей библиотекой парами параметров URLEncoding. Я думаю, что я в квадрате, спасибо! –

+0

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

+0

Я уверен, что ты прав, Боб. Мне пришлось несколько раз модифицировать код библиотеки OAuthConsumer, и теперь я перешел к другому запросу POST со многими другими параметрами, а подпись ошибочна. Вернуться к доске для рисования. :) –

4

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

+0

Боб, спасибо за указание на RFC 5849. В разделе 3.4.1.1 приведен полный пример базовой строки, используемой в шифровании. Я смог проверить, что он, по-видимому, отлично соответствует моей базовой строке. Это не является хорошим предзнаменованием ... –

+2

Это, по-видимому, распространенная ошибка, которая не очень четко указана в документации OAuth, что параметры, включенные в GET или POST, должны быть -сортированы (например: a = 1 & b = 2 .. b = 2 & a = 1 даст вместо этого ошибку). – hikari

+0

Не только это, но вы можете выполнять как параметры GET, так и POST, а также параметры из заголовка авторизации. Все они должны быть объединены, а затем отсортированы. –