Question

La réponse à une question précédente a montré que Nexus mettre en œuvre un assistant d'authentification personnalisée appelée "NxBASIC".

Comment puis-je commencer à mettre en œuvre un gestionnaire en python?


Mise à jour:

Mise en œuvre du gestionnaire par la suggestion d'Alex semble être la bonne approche, mais ne parvient en essayant d'extraire le schéma et le domaine de la authreq. La valeur renvoyée pour authreq est:

str: NxBASIC realm="Sonatype Nexus Repository Manager API""

AbstractBasicAuthHandler.rx.search (authreq) est seulement un seul retour tuple:

tuple: ('NxBASIC', '"', 'Sonatype Nexus Repository Manager API')

régime, royaume = mo.groups () échoue. De ma connaissance regex limitée, il ressemble à l'expression rationnelle standard à partir AbstractBasicAuthHandler doit correspondre schéma et le domaine, mais il ne semble pas.

Le regex est:

rx = re.compile('(?:.*,)*[ \t]*([^ \t]+)[ \t]+'
                'realm=(["\'])(.*?)\\2', re.I)

Mise à jour 2: De l'inspection des AbstractBasicAuthHandler, le traitement par défaut est de faire:

scheme, quote, realm = mo.groups()

Modification de cela fonctionne. J'ai besoin de me mettre le mot de passe sur le royaume correct. Merci Alex!

Était-ce utile?

La solution

Si, comme décrit, le nom et la description sont les seules différences entre cette « NxBasic » et bon vieux « Basic », vous pouvez essentiellement copier-coller-éditer un code de urllib2.py (qui malheureusement ne l'expose pas nom du système aussi facilement substituable en lui-même), comme suit (voir urllib2.py sources en ligne d '):

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

Comme vous pouvez le voir par l'inspection, je viens de changer deux chaînes de « Basic » à « NxBasic » (et les équivalents en minuscules) de ce qui est en urrlib2.py (dans le gestionnaire auth de base abstraite superclasse de http auth de base classe de gestionnaire).

Essayez d'utiliser cette version - et si elle ne fonctionne toujours pas, au moins avoir ce soit votre code peut vous aider à ajouter impression / déclarations d'exploitation forestière, des points d'arrêt, etc., afin de mieux comprendre ce qui se briser et comment. Bonne chance! (Désolé, je ne peux plus mais je n'ai pas Nexus autour d'expérimenter).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top