Frage

Die Antwort auf eine vorherige Frage zeigte, dass Nexus eine Umsetzung benutzerdefinierte Authentifizierung Helfer genannt "NxBASIC".

Wie kann ich beginnen, einen Handler in Python zu implementieren?


Update:

Die Umsetzung der Handler pro Alex Vorschlag sieht den richtigen Ansatz zu sein, aber nicht versucht, das Schema und Reich aus dem AUTHREQ zu extrahieren. Der Rückgabewert für AUTHREQ ist:

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

AbstractBasicAuthHandler.rx.search (AUTHREQ) nur ein einziges Tupel Rückkehr:

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

so Schema, realm = mo.groups () fehlschlägt. Aus meinem begrenzten regex Wissen sieht es aus wie der Standard-regex aus AbstractBasicAuthHandler sollte Schema und Reich passen, aber es scheint nicht zu.

Die Regex ist:

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

Update 2: Von Inspektion von AbstractBasicAuthHandler, ist die Standard-Verarbeitung zu tun:

scheme, quote, realm = mo.groups()

Die Umstellung auf das funktioniert. Ich brauche jetzt nur noch das Passwort gegen den richtigen Bereich zu setzen. Dank Alex!

War es hilfreich?

Lösung

Wenn, wie beschrieben, Name und Beschreibung der einzige Unterschied zwischen dieser „NxBasic“ ist und die gute alte „Basic“, dann könnte man im Wesentlichen copy-paste-edit einige Codes aus urllib2.py (was leider aussetzen nicht dem Schema Namen wie leicht überwindbare in sich selbst), wie folgt (siehe urllib2.py 's Online-Quellen):

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

Wie Sie durch Inspektion sehen können, habe ich gerade geändert zwei Strings von „Basic“ auf „NxBasic“ (und der Klein Äquivalente) aus, was in urrlib2.py (in der abstrakten Basis Auth-Handler übergeordneten Klasse der HTTP-Basisauthentifizierungs Handler-Klasse).

Versuchen Sie, diese Version verwenden - und wenn es immer noch nicht funktioniert, zumindest mit ihm Code sein können Sie Druck / Logging-Anweisungen, Unterbrechungspunkte hinzufügen helfen, etc, um besser zu verstehen, was zu brechen und wie. Viel Glück! (Leider kann ich nicht weiter helfen, aber ich habe keine Nexus um zu experimentieren).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top