Аутентификация Windows с помощью Python и urllib2

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

До сих пор у меня было:

opener = build_opener()
try:
    page = opener.open("http://somepagewhichneedsmywindowsusernameandpassword/")
    print page
except URLError:
    print "Oh noes."

Поддерживается ли это urllib2? Я нашел Python NTLM, но для этого требуется, чтобы я ввел свое имя пользователя и пароль. Есть ли способ как-то просто получить информацию об аутентификации ( например, IE или Firefox, если я изменил настройки network.automatic-ntlm-auth.trusted-uris).

Изменить после ответа msander

Итак, я получил следующее:

# Send a simple "message" over a socket - send the number of bytes first,
# then the string.  Ditto for receive.
def _send_msg(s, m):
    s.send(struct.pack("i", len(m)))
    s.send(m)

def _get_msg(s):
    size_data = s.recv(struct.calcsize("i"))
    if not size_data:
        return None
    cb = struct.unpack("i", size_data)[0]
    return s.recv(cb)

def sspi_client():
    c = httplib.HTTPConnection("myserver")
    c.connect()
    # Do the auth dance.
    ca = sspi.ClientAuth("NTLM", win32api.GetUserName())
    data = None
    while 1:
        err, out_buf = ca.authorize(data) # error 400 triggered by this line
        _send_msg(c.sock, out_buf[0].Buffer)

        if err==0:
            break

        data = _get_msg(c.sock)

    print "Auth dance complete - sending a few encryted messages"
    # Assume out data is sensitive - encrypt the message.
    for data in "Hello from the client".split():
        blob, key = ca.encrypt(data)
        _send_msg(c.sock, blob)
        _send_msg(c.sock, key)
    c.sock.close()
    print "Client completed."

который довольно хорошо разорван из socket_server.py (см. здесь). Но я получаю ошибку 400 - плохой запрос. У кого-нибудь есть какие-то дальнейшие идеи?

Спасибо,

Дом

Ответ 1

Предполагая, что вы пишете свой клиентский код в Windows и нуждаетесь в полной аутентификации NTLM, тогда вы должны прочитать сообщение Mark Hammond сообщение о подключении к NTLM из python -win32, который по сути отвечает на тот же вопрос. Это указывает на код примера sspi, включенный в расширения Python Win32 (которые включены в ActivePython и в противном случае может быть скачан здесь).

Ответ 2

Существует несколько форм аутентификации, которые могут использовать веб-сайты.

  • HTTP-аутентификация. Это, когда браузер открывает окно для ввода вашего имени пользователя и пароля. Существует два механизма: базовый и дайджест. Существует заголовок "Авторизация", который поставляется вместе со страницей, которая сообщает браузеру (или программе, использующей urllib2), что делать.

    В этом случае вы должны настроить urlopener для предоставления ответов, которые должен видеть заголовок авторизации. Вам нужно будет создать либо HTTPBasicAuthHandler, либо HTTPDigestAuthHandler.

    Для AuthHandlers требуется PasswordManager. У этого менеджера паролей могут быть жестко закодированные имя пользователя и пароль (очень распространенные), или он может быть умным и работать с вашим паролем Windows из некоторого Windows API.

  • Проверка подлинности приложения. Здесь веб-приложение направляет вас на страницу с формой, в которой вы заполняете имя пользователя и пароль. В этом случае ваша программа Python должна использовать urllib2 для выполнения POST (a запрос с данными), где данные заполняются должным образом. Ответ на сообщение обычно содержит файл cookie, который позволяет вам получить доступ. Вам не нужно беспокоиться о cookie, urllib2 обрабатывает это автоматически.

Откуда вы знаете, что у вас есть? Вы отбрасываете заголовки ответа. Ответ от urllib2.openurl включает все заголовки (в page.info()), а также содержимое страницы.

Прочитайте HTTP-аутентификацию в Python

Как войти в форум phpBB3 через Python script с помощью urllib, urllib2 и ClientCookie?

Как получить доступ к аутентифицированной службе Google App Engine от клиента (не веб-сайта) python?