Создайте заголовок дайджеста авторизации с помощью urllib2 или запросов

Я пытаюсь создать заголовок авторизации дайджеста для использования в тестовом примере python. Из-за того, как работает база кода, важно, чтобы я мог получить заголовок в виде строки. Этот заголовок выглядит примерно так

Authorization: Digest username="the_user", realm="my_realm", nonce="1389832695:d3c620a9e645420228c5c7da7d228f8c", uri="/some/uri", response="b9770bd8f1cf594dade72fe9abbb2f31"

Я думаю, что лучше всего использовать либо urllib2, либо библиотеку запросов.

С urllib2 я продвинулся так далеко:

au=urllib2.HTTPDigestAuthHandler()
au.add_password("my_realm", "http://example.com/", "the_user", "the_password")

но я не могу получить заголовок из этого.

С запросами я зашел так далеко:

requests.HTTPDigestAuth("the_user", "the_password")

Но я, когда пытаюсь использовать это, в запросе получаю ошибки об установке области, которую я не могу понять, как это сделать.


person scottmrogowski    schedule 16.01.2014    source источник


Ответы (1)


Если вы готовы изворачиваться вокруг этого, вы можете заставить класс requests.auth.HTTPDigestAuth дать вам правильный ответ, выполнив что-то вроде этого:

from requests.auth import HTTPDigestAuth

chal = {'realm': 'my_realm', 'nonce': '1389832695:d3c620a9e645420228c5c7da7d228f8c'}
a = HTTPDigestAuth('the_user', password)
a.chal = chal

print a.build_digest_header('GET', '/some/uri')

Если я использую 'the_password' в качестве пароля пользователя, это дает мне такой результат:

Digest username="the_user", realm="my_realm", nonce="1389832695:d3c620a9e645420228c5c7da7d228f8c", uri="/some/uri", response="0b34daf411f3d9739538c7e7ee845e92"
person Lukasa    schedule 17.01.2014
comment
У меня возникли проблемы с созданием одноразового номера. Я нашел это: md5("%d:%s" % (time.time(), 'the_realm')).hexdigest()} но это не работает. - person scottmrogowski; 17.01.2014
comment
У вас есть непревзойденная скобка в конце. - person Lukasa; 17.01.2014
comment
Также похоже, что вы должны использовать MD5 только для области, а не для всей строки. Таким образом, подходящей строкой будет: `%d:%d % (time.time(), md5('the_realm').hexdigest()) - person Lukasa; 17.01.2014