2009-04-06 7 views
15

Quel est le équivallent python urllib deauthentification HTTP en Python

curl -u username:password status="abcd" http://example.com/update.json 

Je l'ai fait:

handle = urllib2.Request(url) 
authheader = "Basic %s" % base64.encodestring('%s:%s' % (username, password)) 
handle.add_header("Authorization", authheader) 

Y at-il une meilleure/façon plus simple?

Répondre

20

L'astuce consiste à créer un gestionnaire de mots de passe, puis d'en parler à urllib. Habituellement, vous ne vous soucierez pas du domaine de l'authentification, seulement la partie hôte/URL. Par exemple, les éléments suivants:

password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
top_level_url = "http://example.com/" 
password_mgr.add_password(None, top_level_url, 'user', 'password') 
handler = urllib2.HTTPBasicAuthHandler(password_mgr) 
opener = urllib2.build_opener(urllib2.HTTPHandler, handler) 
request = urllib2.Request(url) 

va définir le nom d'utilisateur et mot de passe pour chaque URL commençant par top_level_url. Les autres options sont de spécifier un nom d'hôte ou une URL plus complète ici.

Un bon document décrivant ceci et plus est à http://www.voidspace.org.uk/python/articles/urllib2.shtml#id6.

+2

Comment est-ce plus simple que l'exemple initial? – ibz

+1

ibz: Je n'ai jamais prétendu que c'était plus simple, mais dans mon exemple de code, vous n'avez pas à manipuler manuellement les chaînes de nom d'utilisateur et de mot de passe. De plus, vous en obtenez toutes sortes d'avantages, comme le code qui détermine si vous voulez réellement envoyer les informations d'authentification au serveur, en fonction de l'URL. Vous pouvez ou ne pouvez pas avoir besoin de tout cela; Choisissez une solution qui fonctionne pour vous. – Ivo

+0

J'ai trouvé le truc de passman ne fonctionnait pas. L'ajout de l'en-tête utilisateur/passe base64 selon cette réponse http://stackoverflow.com/a/18592800/623159 a bien fonctionné. Accéder à l'URL jenkins comme http: // /job//lastCompletedBuild/testR eport/api/python – gaoithe

6

Oui, jetez un oeil à la urllib2.HTTP*AuthHandlers.

Exemple de la documentation:

import urllib2 
# Create an OpenerDirector with support for Basic HTTP Authentication... 
auth_handler = urllib2.HTTPBasicAuthHandler() 
auth_handler.add_password(realm='PDQ Application', 
          uri='https://mahler:8092/site-updates.py', 
          user='klem', 
          passwd='kadidd!ehopper') 
opener = urllib2.build_opener(auth_handler) 
# ...and install it globally so it can be used with urlopen. 
urllib2.install_opener(opener) 
urllib2.urlopen('http://www.example.com/login.html') 
Questions connexes