3

の質問への回答は、Nexus が「NxBASIC」と呼ばれるカスタム認証ヘルパーを実装していることを示していました。

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 の標準正規表現はスキームとレルムに一致するはずですが、そうではないようです。

正規表現は次のとおりです。

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

更新 2: AbstractBasicAuthHandler の検査から、デフォルトの処理は次のようになります。

scheme, quote, realm = mo.groups()

これに変更するとうまくいきます。正しいレルムに対してパスワードを設定するだけです。ありがとうアレックス!

4

1 に答える 1

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 基本認証ハンドラー クラスの抽象基本認証ハンドラー スーパークラス) にあるものから、2 つの文字列を "Basic" から "NxBasic" (および小文字の同等物) に変更しました。 .

このバージョンを使用してみてください。それでもうまくいかない場合は、少なくとも自分のコードにすることで、print/logging ステートメント、ブレークポイントなどを追加して、何が壊れているのか、どのように壊れているのかをよりよく理解することができます。頑張ってください!(申し訳ありませんが、これ以上お手伝いできませんが、実験するネクサスはありません)。

于 2009-07-05T17:55:26.427 に答える