La implementación de un encargo del pitón manejador de la autenticación
Pregunta
La respuesta a una pregunta anterior href="https://stackoverflow.com/questions/1080179/handling-authentication-and-proxy-servers-with-httplib2"> mostró que implementar un Nexus ayudante de autenticación personalizado llama "NxBASIC".
¿Cómo empiezo a implementar un controlador en Python?
Actualización:
La implementación del controlador según la sugerencia de Alex parece ser el enfoque correcto, pero no tratar de extraer el esquema y el reino de la AUTHREQ. El valor devuelto por AUTHREQ es:
str: NxBASIC realm="Sonatype Nexus Repository Manager API""
AbstractBasicAuthHandler.rx.search (AUTHREQ) sólo se devolver un solo tupla:
tuple: ('NxBASIC', '"', 'Sonatype Nexus Repository Manager API')
so esquema, realm = mo.groups () falla. Desde mi conocimiento limitado de expresiones regulares que parece que la expresión regular estándar de AbstractBasicAuthHandler debe coincidir esquema y el reino, pero parece que no.
La expresión regular es:
rx = re.compile('(?:.*,)*[ \t]*([^ \t]+)[ \t]+'
'realm=(["\'])(.*?)\\2', re.I)
Actualización 2: De la inspección de AbstractBasicAuthHandler, el procesamiento por defecto es hacer:
scheme, quote, realm = mo.groups()
El cambio a esto funciona. Ahora sólo hay que establecer la contraseña correcta contra el reino. Gracias Alex!
Solución
Si, como se ha descrito, el nombre y la descripción son las únicas diferencias entre este "NxBasic" y el bueno de "Básico", entonces usted podría esencialmente copiar y pegar a editar un código de urllib2.py (que por desgracia no exponer la nombre esquema tan fácilmente reemplazable en sí mismo), como sigue (véase urllib2.py 's de fuentes en línea):
import urllib2
class HTTPNxBasicAuthHandler(urllib2.HTTPBasicAuthHandler):
def http_error_auth_reqed(self, authreq, host, req, headers):
# host may be an authority (without userinfo) or a URL with an
# authority
# XXX could be multiple headers
authreq = headers.get(authreq, None)
if authreq:
mo = AbstractBasicAuthHandler.rx.search(authreq)
if mo:
scheme, realm = mo.groups()
if scheme.lower() == 'nxbasic':
return self.retry_http_basic_auth(host, req, realm)
def retry_http_basic_auth(self, host, req, realm):
user, pw = self.passwd.find_user_password(realm, host)
if pw is not None:
raw = "%s:%s" % (user, pw)
auth = 'NxBasic %s' % base64.b64encode(raw).strip()
if req.headers.get(self.auth_header, None) == auth:
return None
req.add_header(self.auth_header, auth)
return self.parent.open(req)
else:
return None
Como se puede ver por inspección, sólo he cambiado dos cadenas de "básico" para "NxBasic" (y los equivalentes en minúsculas) de lo que está en urrlib2.py (en abstracto superclase básica manejador de autenticación de la autenticación básica HTTP clase de controlador).
Trate de usar esta versión - y si aún no funciona, al menos teniendo que sea su código puede ayudar a añadir de impresión / declaraciones de registro, puntos de interrupción, etc., para comprender mejor lo que está rompiendo y cómo. ¡La mejor de las suertes! (Lo siento, no puedo ayudar más, pero no tengo ningún nexo en torno a experimentar con).