2011-08-16 28 views
5

Tôi cần thực hiện xác thực cơ bản ưu tiên đối với máy chủ HTTP, tức là xác thực ngay lập tức mà không phải chờ phản hồi 401. Điều này có thể được thực hiện với httplib2?Tôi có thể thực hiện xác thực trước bằng httplib2 không?

Edit:

Tôi giải quyết nó bằng cách thêm một tiêu đề ủy quyền để yêu cầu, như đề xuất trong câu trả lời được chấp nhận:

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

Điều này cũng phù hợp với 'httplib' được tích hợp sẵn, xem câu trả lời của tôi bên dưới. –

+0

tôi cũng sẽ +1 nếu bạn đã bao gồm tập lệnh python để xác thực chống lại jenkins/hudson – Toskan

Trả lời

4

Thêm một tiêu đề hình thành một cách thích hợp 'Cho Phép' để yêu cầu ban đầu của bạn .

+1

Bạn có thể minh họa không? Tôi không có chuyên gia HTTP. – aknuds1

4

Điều này cũng hoạt động với built-in httplib (dành cho bất kỳ ai muốn giảm thiểu libs/mô-đun bên thứ ba). Tôi đang sử dụng nó để xác thực với máy chủ Jenkins của chúng tôi bằng cách sử dụng Mã thông báo API mà Jenkins có thể tạo cho từng người dùng.

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

Tôi nhận ra điều này là cũ, nhưng tôi nghĩ tôi sẽ giải quyết nếu bạn đang sử dụng Python 3 với httplib2 vì tôi không thể tìm thấy nó ở bất kỳ nơi nào khác. Tôi cũng xác thực với máy chủ Jenkins bằng cách sử dụng Mã thông báo API cho mỗi người dùng Jenkins. Nếu bạn không quan tâm đến Jenkins, chỉ cần thay thế mật khẩu của người dùng thực tế cho Mã thông báo API.

b64encode đang mong đợi một chuỗi ký tự ASCII nhị phân. Với Python 3 một TypeError sẽ được nâng lên nếu một chuỗi đơn giản được truyền vào. Để giải quyết vấn đề này, phần "người dùng: api_token" của tiêu đề phải được mã hóa bằng cách sử dụng 'ascii' hoặc 'utf-8', được chuyển đến b64encode, sau đó chuỗi byte kết quả phải được giải mã thành một chuỗi đơn giản trước khi được đặt trong tiêu đề. Đoạn mã sau đã làm những gì tôi cần:

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) 
Các vấn đề liên quan