【问题标题】:Implementing a custom Python authentication handler实现自定义 Python 身份验证处理程序
【发布时间】:2010-11-08 00:45:00
【问题描述】:

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')

so scheme,realm = mo.groups() 失败。从我有限的正则表达式知识看来,来自 AbstractBasicAuthHandler 的标准正则表达式应该匹配方案和领域,但似乎不匹配。

正则表达式是:

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

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

scheme, quote, realm = mo.groups()

更改为这个作品。我现在只需要针对正确的领域设置密码。谢谢亚历克斯!

【问题讨论】:

  • 不幸的是,我无法解密给定的 Java 源代码以了解这与基本身份验证有何不同——如果有人解释这个“NxBasic”身份验证(它是如何与 Basic 不同,特别是!)。
  • 与 HttpBasicHelper 的比较表明 HttpNxBasicHelper 是直接副本。唯一的区别似乎是 ChallengeScheme 的名称和描述。
  • 是的,+1 表示成功!-) 不知道为什么我从标准库源中复制、粘贴和稍微编辑的代码只分配了 2 个需要 3 个的组(我没有触及那部分),但是为了完成解决方案,无论如何你都应该得到 +1!-)
  • 我从 urllib2.py 的第 817 行得到了更改,也许你有不同的版本?无论哪种方式都可能值得编辑答案。再次感谢

标签: python restlet nexus httplib2


【解决方案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 中的两个字符串从“Basic”更改为“NxBasic”(以及小写等效项)(在 http 基本身份验证的抽象基本身份验证处理程序超类中)处理程序类)。

尝试使用这个版本——如果它仍然无法正常工作,至少让它成为您的代码可以帮助您添加打印/日志记录语句、断点等,以更好地了解什么是中断以及如何中断。祝你好运! (抱歉,我帮不上忙,但我没有任何 Nexus 可以试验)。

【讨论】:

  • 谢谢亚历克斯,等我有一台合适的电脑试试看
  • 不知道你只有不正确的 - 那么,我猜我只能等到你解决这个问题,然后我才能知道这是否对你有帮助!-)
  • 访问浏览器并不意味着访问开发工具(或获得重要其他人的批准使用它们)。这很有帮助,但请查看我的更新以了解最新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多