Реализация пользовательского обработчика аутентификации Python

StackOverflow https://stackoverflow.com/questions/1080920

Вопрос

Ответ на вопрос предыдущий вопрос показал, что Nexus реализует пользовательский помощник по аутентификации называется "NxBASIC".

Как мне начать реализовывать обработчик на python?


Обновить:

Реализация обработчика по предложению Алекса выглядит правильным подходом, но попытка извлечь схему и область из authreq завершается неудачей.Возвращаемое значение для authreq равно:

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

AbstractBasicAuthHandler.rx.search(authreq) возвращает только один кортеж:

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

итак, схема realm = mo.groups() завершается неудачей.Исходя из моих ограниченных знаний о регулярных выражениях, похоже, что стандартное регулярное выражение из AbstractBasicAuthHandler должно соответствовать scheme и realm, но, похоже, это не так.

Регулярное выражение является:

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

Обновление 2:Из проверки AbstractBasicAuthHandler обработка по умолчанию заключается в выполнении:

scheme, quote, realm = mo.groups()

Переход на это работает.Теперь мне просто нужно установить пароль на правильную область.Спасибо, Алекс!

Это было полезно?

Решение

Если, как описано, название и описание являются единственными различиями между этим "NxBasic" и старым добрым "Basic", то вы могли бы по существу скопировать-вставить-отредактировать некоторый код из urllib2.py (что, к сожалению, само по себе не делает название схемы легко переопределяемым), следующим образом (см. urllib2.pyонлайн-источники):

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

Как вы можете видеть при проверке, я только что изменил две строки с "Basic" на "NxBasic" (и эквиваленты в нижнем регистре) из того, что находится в urrlib2.py (в абстрактном базовом суперклассе auth handler класса http basic auth handler).

Попробуйте использовать эту версию - и если она все еще не работает, по крайней мере, использование этого кода в вашем коде может помочь вам добавить инструкции печати / ведения журнала, точки останова и т.д., Чтобы лучше понять, что и как ломается.Желаю удачи!(Извините, я больше ничем не могу помочь, но у меня нет никакой Связи, с которой можно было бы поэкспериментировать).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top