2009-05-26 21 views
10

Quiero capturar algunos datos de una página web que requiere mi nombre de usuario y contraseña de Windows.Autenticación de Windows con Python y urllib2

Hasta ahora, Tengo:

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

Es esto apoyado por urllib2? He encontrado Python NTLM, pero eso requiere que ingrese mi nombre de usuario y contraseña. ¿Hay alguna forma de obtener la información de autenticación de alguna manera (por ejemplo, como lo hace IE, o Firefox, si cambié la configuración de network.automatic-ntlm-auth.trusted-uris).

Edición después de la respuesta de msander

Así que ahora tengo esto:

# 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." 

que está bastante bien arrancado de socket_server.py (ver here). Pero recibo un error 400 - solicitud incorrecta. ¿Alguien tiene más ideas?

Gracias,

Dom

+0

por "agarrar la información de autenticación" ¿quiere decir, obtener su nombre de dominio y contraseña de algún lugar, y usarlos en su secuencia de comandos? Me encantaría saber si también es posible :) – kender

+0

@kender - Sí, eso es exactamente lo que quiero decir. –

+0

Tal vez le ayude a escribir [mi pregunta] (http://stackoverflow.com/questions/356321/scripted-files-download-under-windows). – kender

Respuesta

-2

Hay varias formas de autenticación que los sitios web pueden utilizar.

  1. HTTP Authentication. Aquí, el navegador muestra una ventana para que ingrese su nombre de usuario y contraseña. Hay dos mecanismos: básico y digestivo. Hay un encabezado de "Autorización" que viene junto con la página que le dice a un navegador (o a un programa que usa urllib2) qué hacer.

    En este caso, debe configurar su urlopener para proporcionar las respuestas que el encabezado de autorización necesita ver. Necesitará construir un HTTPBasicAuthHandler o HTTPDigestAuthHandler.

    AuthHandlers requieren un PasswordManager. Este administrador de contraseñas podría tener un nombre de usuario y contraseña codificados (muy común) o podría ser inteligente y resolver su contraseña de Windows desde alguna API de Windows.

  2. Autenticación de aplicación. Aquí es donde la aplicación web lo dirige a una página con un formulario que completa con un nombre de usuario y contraseña. En este caso, su programa Python debe usar urllib2 para hacer una POST (a request with data) donde los datos son el formulario rellenado correctamente. La respuesta a la publicación generalmente contiene una cookie, que es lo que le permite un mayor acceso. No necesita preocuparse mucho por la cookie, urllib2 maneja esto automáticamente.

¿Cómo sabes cuál tienes? Usted tira los encabezados en la respuesta. La respuesta de urllib2.openurl incluye todos los encabezados (en page.info()), así como el contenido de la página.

Leer HTTP Authentication in Python

How would one log into a phpBB3 forum through a Python script using urllib, urllib2 and ClientCookie?

How do you access an authenticated Google App Engine service from a (non-web) python client?

+2

El OP está preguntando por la seguridad integrada de Windows que no usa basic o digest. – bpeikes

16

Suponiendo que usted está escribiendo su código de cliente en Windows y necesita la autenticación NTLM sin problemas entonces usted debe leer Hooking in NTLM post de Mark Hammond de la lista de correo python-win32 cuales esencialmente responde la misma preguntaEsto apunta al código de ejemplo sspi incluido con las extensiones Python Win32 (que se incluyen con ActivePython y de lo contrario puede ser downloaded here).

+0

OK - esto se ve como quiero ir, gracias. –

Cuestiones relacionadas