Как правильно получить дайджест-аутентификацию
Я пытаюсь написать приложение на 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
в шапке решает проблему.