Вот простой базовый обработчик аутентификации Preemptive HTTP, основанный на коде из urllib2.HTTPBasicAuthHandler
. Его можно использовать точно таким же образом, за исключением того, что заголовок Authorization
будет добавлен к каждому запросу с соответствующим URL-адресом. Обратите внимание, что этот обработчик должен использоваться с HTTPPasswordMgrWithDefaultRealm
. Это потому, что нет никакого царства, возвращающегося в WWW-Authenticate
вызове, потому что вы упреждающий.
class PreemptiveBasicAuthHandler(urllib2.BaseHandler):
def __init__(self, password_mgr=None):
if password_mgr is None:
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
self.passwd = password_mgr
self.add_password = self.passwd.add_password
def http_request(self,req):
uri = req.get_full_url()
user, pw = self.passwd.find_user_password(None,uri)
#logging.debug('ADDING REQUEST HEADER for uri (%s): %s:%s',uri,user,pw)
if pw is None: return req
raw = "%s:%s" % (user, pw)
auth = 'Basic %s' % base64.b64encode(raw).strip()
req.add_unredirected_header('Authorization', auth)
return req