Проверка подлинности Windows с помощью Python и urllib2 - PullRequest
12 голосов
/ 26 мая 2009

Я хочу получить некоторые данные с веб-страницы, для которой требуются имя пользователя и пароль 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 настроек).

Редактировать после ответа мсандера

Итак, теперь у меня есть это:

# 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 - плохой запрос. У кого-нибудь есть еще идеи?

Спасибо

Дом

Ответы [ 2 ]

16 голосов
/ 26 мая 2009

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

0 голосов
/ 26 мая 2009

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

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

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

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

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

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

Чтение HTTP-аутентификация в Python

Как можно войти в форум phpBB3 через скрипт Python, используя urllib, urllib2 и ClientCookie?

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

...