2011-08-16 21 views
5

मुझे एक HTTP सर्वर के खिलाफ प्रीपेप्टिव मूल प्रमाणीकरण करने की आवश्यकता है, यानी, 401 प्रतिक्रिया पर प्रतीक्षा किए बिना तुरंत प्रमाणित करें। क्या यह httplib2 के साथ किया जा सकता है?क्या मैं httplib2 के साथ प्रीपेप्टिव प्रमाणीकरण कर सकता हूं?

संपादित करें:

मैं के रूप में स्वीकार जवाब में सुझाव दिया, अनुरोध करने के लिए एक प्राधिकरण हैडर जोड़कर इसे हल:

headers["Authorization"] = "Basic {0}".format(
     base64.b64encode("{0}:{1}".format(username, password))) 
+0

यह अंतर्निहित 'httplib' के लिए भी काम करता है, नीचे मेरा उत्तर देखें। –

+0

अच्छी तरह से अगर आप जेनकिंस/हडसन – Toskan

उत्तर

4

अपने प्रारंभिक अनुरोध करने के लिए एक उचित रूप से गठन 'प्राधिकरण' शीर्षक जोड़ें ।

+1

के खिलाफ प्रमाणीकरण के लिए अपनी पायथन लिपि शामिल करते हैं तो मैं +1 कर दूंगा? क्या आप उदाहरण दे सकते हैं? मैं कोई HTTP विशेषज्ञ नहीं हूँ। – aknuds1

4

यह अंतर्निहित httplib (किसी भी व्यक्ति के लिए तृतीय-पक्ष libs/मॉड्यूल को कम करने की इच्छा रखने वाले) के साथ भी काम करता है। मैं एपीआई टोकन का उपयोग करके हमारे जेनकींस सर्वर के साथ प्रमाणित करने के लिए इसका उपयोग कर रहा हूं कि जेनकिंस प्रत्येक उपयोगकर्ता के लिए बना सकता है।

>>> import base64, httplib 
>>> headers = {} 
>>> headers["Authorization"] = "Basic {0}".format(
     base64.b64encode("{0}:{1}".format('<username>', '<jenkins_API_token>'))) 

>>> ## Enable the job 
>>> conn = httplib.HTTPConnection('jenkins.myserver.net') 
>>> conn.request('POST', '/job/Foo-trunk/enable', None, headers) 
>>> resp = conn.getresponse() 
>>> resp.status 
302 

>>> ## Disable the job 
>>> conn = httplib.HTTPConnection('jenkins.myserver.net') 
>>> conn.request('POST', '/job/Foo-trunk/disable', None, headers) 
>>> resp = conn.getresponse() 
>>> resp.status 
302 
1

मुझे पता है यह पुराना है, लेकिन मैं समझ मैं समाधान में फेंक अगर आप httplib2 साथ अजगर 3 का उपयोग कर रहे के बाद से मैं नहीं किया है यह कहीं और खोजने के लिए सक्षम था। मैं प्रत्येक जेनकींस उपयोगकर्ता के लिए एपीआई टोकन का उपयोग कर जेनकिंस सर्वर के खिलाफ भी प्रमाणीकरण कर रहा हूं। यदि आप जेनकींस से चिंतित नहीं हैं, तो एपीआई टोकन के लिए वास्तविक उपयोगकर्ता का पासवर्ड बस प्रतिस्थापित करें।

बी 64encode ASCII वर्णों की बाइनरी स्ट्रिंग की अपेक्षा कर रहा है। पाइथन 3 के साथ एक सादा स्ट्रिंग पारित होने पर टाइपरर उठाया जाएगा। इसके चारों ओर जाने के लिए, हेडर के "उपयोगकर्ता: api_token" भाग को 'ascii' या 'utf-8' का उपयोग करके एन्कोड किया जाना चाहिए, b64encode को पास किया गया है, तब परिणामस्वरूप बाइट स्ट्रिंग को हेडर में रखने से पहले एक सादे स्ट्रिंग को डीकोड किया जाना चाहिए। निम्नलिखित कोड ने मुझे जो किया था:

import httplib2, base64 

cred = base64.b64encode("{0}:{1}".format(
    <user>, <api_token>).encode('utf-8')).decode() 
headers = {'Authorization': "Basic %s" % cred} 
h = httplib2.Http('.cache') 
response, content = h.request("http://my.jenkins.server/job/my_job/enable", 
    "GET", headers=headers) 
संबंधित मुद्दे