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!

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top