Как правильно получить дайджест-аутентификацию

Я пытаюсь написать приложение на C++, и мне нужно выполнить HTTP Digest Authentication. Проблема в первую очередь не в C++, а в том, что соединение не устанавливается. Веб-сайт, к которому я пытаюсь получить доступ, является следующим: httpbin.org/digest-auth/auth/user/passwd.

Рассмотрим следующий ответ сервера на простой GET /digest-auth/auth/user/passwd:

HTTP/1.1 401 UNAUTHORIZED Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: * Content-Type: text/html; charset=utf-8 Date: Mon, 08 Sep 2014 15:10:09 GMT Server: gunicorn/18.0 Set-Cookie: fake=fake_value Www-Authenticate: Digest realm="me@kennethreitz.com", nonce="2a932bfb1f9a748a7b5ee590d0cf99e0", qop=auth, opaque="2d09668631b42bff8375523e7b27e45e" Content-Length: 0 Connection: keep-alive

A1 Затем вычисляется как user:me@kennethreitz.com:passwd и хэшируется 4de666b60f91e2444f549243bed5fa4b который я буду называть HA1.A2 вычисляется как GET:/digest-auth/auth/user/passwd и прибавил b44272ea65ee4af7fb26c5dba58f6863 который я буду называть HA2.

С этой информацией ответ вычисляется как HA1:nonce:1:ac3yyj:auth:HA2, где HA1 а также HA2 это значения, которые мы только что вычислили, а nonce берется из ответа сервера выше, который в сумме: 4de666b60f91e2444f549243bed5fa4b:2a932bfb1f9a748a7b5ee590d0cf99e0:1:ac3yyj:auth:b44272ea65ee4af7fb26c5dba58f6863, Хеш этого 55f292e183ead0810528bb2a13b98e00,

Объединение всей этой информации должно быть достаточным для установления http-соединения с использованием дайджест-аутентификации. Однако следующий запрос отклоняется сервером и отвечает другим HTTP/1.1 401,

GET /digest-auth/auth/user/passwd HTTP/1.1 Host: httpbin.org Authorization: Digest username="user", realm="me@kennethreitz.com",nonce="2a932bfb1f9a748a7b5ee590d0cf99e0",uri="/digest-auth/auth/user/passwd",qop=auth,nc=1,cnonce="ac3yyj",response="55f292e183ead0810528bb2a13b98e00",opaque="2d09668631b42bff8375523e7b27e45e"

Обратите внимание, что форматирование не показывает структуру запроса. Блок от Авторизации до непрозрачного - фактически одна строка.

Не стесняйтесь заново выполнить md5-расчет - но я переделал вычисления вручную и получил те же хеши, что и моя программа. Я использовал этот инструмент ( http://md5-hash-online.waraxe.us/) для ручных вычислений.

Я что-то упускаю здесь очевидное, возможно, неправильно истолковывает стандарт? Почему я не могу получить разрешение?

1 ответ

Решение

Наконец то понял. Сама аутентификация полностью правильная.

Сервер требует, чтобы был установлен cookie. Видимо, в ответе нужно показать и этот куки. Это объясняет, почему firefox (будучи браузером) может правильно проходить аутентификацию, в то время как curl и lwp-request не могут придерживаться стандарта - RFC ничего не сказал о файлах cookie. Почему у нас есть стандарты, о которых никто не заботится?

Во всяком случае, добавляя Cookie: fake=fake_value в шапке решает проблему.

Другие вопросы по тегам