سؤال

والجواب على السؤال السابق أظهرت أن نيكزس تنفيذ <وأ href = "http://svn.sonatype.org/nexus/tags/nexus-1.3.4/nexus-clients/nexus-rest-client-java/src/main/java/org/sonatype/nexus/client /rest/HttpNxBasicHelper.java "يختلط =" نوفولو noreferrer "> مخصص المصادقة المساعد ودعا" NxBASIC ".

وكيف يمكنني البدء في تنفيذ معالج في بيثون؟


تحديث:

وتنفيذ معالج في اقتراح أليكس يتطلع إلى أن يكون النهج الصحيح، ولكن فشل محاولة استخراج مخطط وعالم من authreq. القيمة التي تم إرجاعها لauthreq هي:

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

وAbstractBasicAuthHandler.rx.search (authreq) ليست سوى إرجاع الصفوف (tuple) واحدة:

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

وهكذا مخطط، عالم = mo.groups () فشل. من معرفتي باستخدام التعابير المنطقية محدودة يبدو التعبير العادي القياسي من AbstractBasicAuthHandler يجب أن تطابق مخطط وعالم، ولكن على ما يبدو ليس ل.

والتعبير المعتاد هو:

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

وتحديث 2: من تفتيش AbstractBasicAuthHandler، وتجهيز الافتراضي هو القيام به:

scheme, quote, realm = mo.groups()

وتغيير لهذا يعمل. أنا الآن فقط تحتاج إلى إعادة ضبط كلمة المرور على المجال الصحيح. بفضل اليكس!

هل كانت مفيدة؟

المحلول

إذا، كما وصفها، اسم والوصف هي أوجه الاختلاف الوحيد بين هذا "NxBasic" وحسن البالغ من العمر "الأساسية"، ثم هل يمكن نسخ لصق-تحرير أساسا بعض رمز من urllib2.py (والتي للأسف لا يعرض اسم البرنامج كما للتجاوز بسهولة في حد ذاته)، على النحو التالي (انظر <لأ href = "http://svn.python.org/view/python/trunk/Lib/urllib2.py؟revision=72880&view=markup" يختلط = "نوفولو noreferrer "> الصورة 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

وكما ترون من خلال التفتيش، لقد تغيرت تماما سلسلتين من "الأساسية" ب "NxBasic" (وحكمه الصغيرة) من ما هو في urrlib2.py (في مجردة الأساسية الفائقة المصادقة معالج من المصادقة الأساسية HTTP الطبقة معالج).

وحاول استخدام هذا الإصدار - واذا كان لا يزال لا يعمل، على الأقل بعد أن تكون التعليمات البرمجية يمكن أن تساعدك على إضافة طباعة / بيانات تسجيل نقاط التوقف، وما إلى ذلك، من أجل فهم أفضل ما كسر وكيف. حظا سعيدا! (عذرا لا أستطيع أن يساعد على زيادة ولكن ليس لدي أي نيكزس في جميع أنحاء لتجربة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top