2009-05-26 17 views
10

Desidero prelevare alcuni dati da una pagina Web che richiede il nome utente e la password di Windows.Autenticazione di Windows con Python e urllib2

Finora, ho:

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

È questo supportato da urllib2? Ho trovato Python NTLM, ma questo richiede che inserisca il mio nome utente e la mia password. Esiste un modo per afferrare le informazioni di autenticazione in qualche modo (ad es. Come IE o Firefox, se ho modificato le impostazioni network.automatic-ntlm-auth.trusted-uris).

Modifica dopo la risposta di msander

Così ora ho ottenuto questo:

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

che è abbastanza ben strappato dal socket_server.py (vedi here). Ma ottengo un errore 400 - cattiva richiesta. Qualcuno ha altre idee?

Grazie,

Dom

+0

"prendi le informazioni di autenticazione" intendi, prendi il tuo nome di dominio e la password da qualche parte e usali nel tuo script? Mi piacerebbe sapere se è possibile anche :) – kender

+0

@kender - Sì, è esattamente quello che intendo. –

+0

Forse le risposte a [la mia domanda] (http://stackoverflow.com/questions/356321/scripted-files-download-under-windows) ti aiuteranno. – kender

risposta

-2

Ci sono varie forme di autenticazione che i siti web possono utilizzare.

  1. Autenticazione HTTP. Questo in cui il browser apre una finestra in cui inserire il nome utente e la password. Esistono due meccanismi: base e digest. C'è un'intestazione "Autorizzazione" che arriva insieme alla pagina che indica a un browser (o ad un programma che usa urllib2) cosa fare.

    In questo caso, è necessario configurare l'urlopener per fornire le risposte che l'intestazione di autorizzazione deve visualizzare. Avrai bisogno di creare uno HTTPBasicAuthHandler o HTTPDigestAuthHandler.

    AuthHandlers richiede uno PasswordManager. Questo gestore di password potrebbe avere un nome utente e una password hard-coded (molto comuni) o potrebbe essere intelligente e elaborare la password di Windows da alcune API di Windows.

  2. Autenticazione applicazione. Qui è dove l'applicazione web ti indirizza verso una pagina con un modulo da compilare con un nome utente e una password. In questo caso, il tuo programma Python deve usare urllib2 per fare un POST (a request with data) dove i dati sono compilati correttamente. La risposta al post di solito contiene un cookie, che è ciò che ti consente di accedere ulteriormente. Non devi preoccuparti troppo del cookie, urllib2 lo gestisce automaticamente.

Come fai a sapere che cosa hai? Si scaricano le intestazioni sulla risposta. La risposta di urllib2.openurl include tutte le intestazioni (in page.info()) e il contenuto della pagina.

Leggi 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

L'OP sta chiedendo informazioni sulla sicurezza integrata di Windows che non usa basic o digest. – bpeikes

16

Supponendo che si sta scrivendo il codice client su Windows e hanno bisogno di autenticazione NTLM senza soluzione di continuità, allora si dovrebbe leggere Hooking in NTLM post di Mark Hammond dalla mailing list python-win32 che essenzialmente risponde alla stessa domanda.Questo punta al codice di esempio sspi incluso con le estensioni Python Win32 (che sono incluse con ActivePython e altrimenti può essere downloaded here).

+0

OK - questo sembra come voglio andare, grazie. –