实现自定义Python身份验证处理程序

时间:2009-07-03 21:35:59

标签: python restlet nexus httplib2

previous question的答案表明,Nexus实施了一个名为“NxBASIC”的custom authentication helper

如何开始在python中实现处理程序?


更新

根据Alex的建议实现处理程序看起来是正确的方法,但未能尝试从authreq中提取方案和领域。 authreq的返回值是:

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

AbstractBasicAuthHandler.rx.search(authreq)只返回一个元组:

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

所以scheme,realm = mo.groups()失败。从我有限的正则表达式知识看起来,AbstractBasicAuthHandler的标准正则表达式应该与scheme和realm匹配,但似乎没有。

正则表达式是:

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

更新2: 从AbstractBasicAuthHandler的检查,默认处理是:

scheme, quote, realm = mo.groups()

更改为此工作。我现在只需要针对正确的领域设置密码。谢谢Alex!

1 个答案:

答案 0 :(得分:1)

如上所述,如果名称和描述是这个“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

正如您通过检查所看到的,我刚刚从urrlib2.py(在http basic basic的抽象基本auth处理程序超类中)将两个字符串从“Basic”更改为“NxBasic”(以及小写等效项)处理程序类)。

尝试使用此版本 - 如果它仍然无效,至少让它成为您的代码可以帮助您添加打印/日志记录,断点等,以更好地了解什么是破坏和如何。祝你好运! (对不起,我无法继续帮助,但我没有任何Nexus可以试验)。