Pergunta

A resposta a uma pergunta anterior mostrou que Nexus implementar um costume autenticação ajudante chamado "NxBASIC".

Como faço para começar a implementar um manipulador em python?


Update:

A implementação do manipulador por sugestão de Alex parece ser a abordagem certa, mas não tentar extrair o esquema e domínio do authreq. O valor retornado para authreq é:

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

AbstractBasicAuthHandler.rx.search (authreq) só é retornar um único tupla:

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

para esquema, reino = mo.groups () falhar. Do meu conhecimento regex limitada parece que a regex padrão de AbstractBasicAuthHandler deve corresponder ao esquema e domínio, mas não parece.

O regex é:

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

Update 2: Da inspeção de AbstractBasicAuthHandler, o processamento padrão é fazer:

scheme, quote, realm = mo.groups()

Mudar para isso funciona. Eu agora só precisa definir a senha contra o reino correta. Graças Alex!

Foi útil?

Solução

Se, como descrito, nome e descrição são as únicas diferenças entre este "NxBasic" e o bom e velho "Basic", então você poderia essencialmente copiar e colar-editar algum código de urllib2.py (que, infelizmente, não exponha o regime nome tão facilmente substituível em si), como se segue (ver urllib2.py de fontes on-line):

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 você pode ver por inspeção, eu só mudou duas cordas de "Basic" para "NxBasic" (e os equivalentes em minúsculas) do que está em urrlib2.py (no resumo básico superclasse manipulador auth do http autenticação básica classe de manipulador).

Tente usar esta versão - e se ele ainda não está funcionando, pelo menos, tê-lo ser o seu código pode ajudá-lo a adicionar impressão / declarações madeireiras, pontos de interrupção, etc, para entender melhor o que está quebrando e como. Melhor da sorte! (Desculpe eu não posso ajudar mais, mas eu não tenho qualquer Nexus volta a experimentar).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top