2011-08-16 10 views
5

È necessario eseguire l'autenticazione di base preventiva su un server HTTP, ad esempio, autenticarsi immediatamente senza attendere una risposta 401. Questo può essere fatto con httplib2?Posso eseguire l'autenticazione preventiva con httplib2?

Edit:

ho risolto con l'aggiunta di un'intestazione di autorizzazione alla richiesta, come suggerito nella risposta accettata:

headers["Authorization"] = "Basic {0}".format(
     base64.b64encode("{0}:{1}".format(username, password))) 
+0

Questo funziona anche per il 'httplib' incorporato, vedere la mia risposta di seguito. –

+0

beh io vorrei +1 se avessi incluso il tuo script python per l'autenticazione contro jenkins/hudson – Toskan

risposta

4

Aggiungi un header opportunamente formato 'Autorizzazione' alla vostra richiesta iniziale .

+1

Puoi esemplificare? Non sono un esperto di HTTP. – aknuds1

4

Questo funziona anche con il httplib integrato (per chiunque desideri ridurre librerie/moduli di terze parti). Lo sto utilizzando per autenticare con il nostro server Jenkins utilizzando il token API che Jenkins può creare per ciascun utente.

>>> import base64, httplib 
>>> headers = {} 
>>> headers["Authorization"] = "Basic {0}".format(
     base64.b64encode("{0}:{1}".format('<username>', '<jenkins_API_token>'))) 

>>> ## Enable the job 
>>> conn = httplib.HTTPConnection('jenkins.myserver.net') 
>>> conn.request('POST', '/job/Foo-trunk/enable', None, headers) 
>>> resp = conn.getresponse() 
>>> resp.status 
302 

>>> ## Disable the job 
>>> conn = httplib.HTTPConnection('jenkins.myserver.net') 
>>> conn.request('POST', '/job/Foo-trunk/disable', None, headers) 
>>> resp = conn.getresponse() 
>>> resp.status 
302 
1

Mi rendo conto che è vecchio, ma ho pensato di gettare la soluzione, se si sta utilizzando Python 3 con httplib2 dal momento che non sono stato in grado di trovare da nessun'altra parte. Sto anche autenticandomi contro un server Jenkins utilizzando il token API per ogni utente Jenkins. Se non sei interessato a Jenkins, sostituisci semplicemente la password dell'utente reale per il token API.

b64encode si aspetta una stringa binaria di caratteri ASCII. Con Python 3 viene generato un errore TypeError se viene passata una stringa semplice. Per aggirare questo problema, la parte "user: api_token" dell'intestazione deve essere codificata usando "ascii" o "utf-8", passato a b64encode, quindi la stringa di byte risultante deve essere decodificata su una stringa semplice prima di essere inserita nell'intestazione. Il codice seguente ha fatto ciò che mi serviva:

import httplib2, base64 

cred = base64.b64encode("{0}:{1}".format(
    <user>, <api_token>).encode('utf-8')).decode() 
headers = {'Authorization': "Basic %s" % cred} 
h = httplib2.Http('.cache') 
response, content = h.request("http://my.jenkins.server/job/my_job/enable", 
    "GET", headers=headers)