在HTTP中,Basic Authorization基本認(rèn)證是一種用來允許Web瀏覽器或其他客戶端程序在請求時提供用戶名和口令形式的身份憑證的一種登錄驗證方式。
在發(fā)送之前是以用戶名追加一個冒號然后串接上口令,并將得出的結(jié)果字符串再用Base64算法編碼。例如,提供的用戶名是Aladdin、口令是open sesame,則拼接后的結(jié)果就是Aladdin:open sesame,然后再將其用Base64編碼,得到QWxhZGRpbjpvcGVuIHNlc2FtZQ==。最終將Base64編碼的字符串發(fā)送出去,由接收者解碼得到一個由冒號分隔的用戶名和口令的字符串。
雖然對用戶名和口令的Base64算法編碼結(jié)果很難用肉眼識別解碼,但它仍可以極為輕松地被計算機所解碼,就像其容易編碼一樣。編碼這一步驟的目的并不是安全與隱私,而是為將用戶名和口令中的不兼容的字符轉(zhuǎn)換為均與HTTP協(xié)議兼容的字符集。
------維基百科
一個典型的HTTP客戶端和HTTP服務(wù)器的對話,服務(wù)器安裝在同一臺計算機上(localhost),包含以下步驟:
一個包含基本認(rèn)證的HTTP請求:
GET /PRivate/index.html HTTP/1.0Host: localhostAuthorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
base64
Python中的base64模塊可以通過base64、base32或base 16編碼將二進制數(shù)據(jù)編碼/解碼為文本。
上面例子中的用戶名為"Aladdin", password為 "open sesame":
>>> import base64>>> print base64.b64encode('Aladdin:open sesame')QWxhZGRpbjpvcGVuIHNlc2FtZQ==>>> print base64.b64decode('QWxhZGRpbjpvcGVuIHNlc2FtZQ==')Aladdin:open sesame
urllib2
python標(biāo)準(zhǔn)庫中使用urllib2來處理基本認(rèn)證。urllib2.HTTPBasicAuthHandler()處理程序可用add_password()來設(shè)置認(rèn)證。
h.add_password(realm,uri,user,passwd)
realm是與驗證相關(guān)聯(lián)的名稱或描述信息,取決于遠(yuǎn)程服務(wù)器。uri是基URL。user和passwd分別指定用戶名和密碼。
import urllib2auth=urllib2.HTTPBasicAuthHandler()auth.add_password('Administrator','http://www.example.com','Dave','123456')opener=urllib2.build_opener(auth)u=opener.open('http://www.example.com/evilplan.html')
源碼中的base64編碼方式:
raw = "%s:%s" % (user, pw)auth = 'Basic %s' % base64.b64encode(raw).strip()
requests
還有一個很常用的requests庫,其中處理基本認(rèn)證:
import requestsrequests.get('https://api.github.com/user', auth=requests.auth.HTTPBasicAuth('user', 'pass'))
因為HTTP Basic Auth很常用,所以也可以直接驗證:
>>> requests.get('https://api.github.com/user', auth=('user', 'pass'))<Response [200]>
或者用request.session()保持認(rèn)證狀態(tài):
s = requests.Session()s.auth = ('user', 'pass')s.get('http://httpbin.org/')
源碼中的base64編碼方式:
def _basic_auth_str(username, password): """Returns a Basic Auth string.""" return 'Basic ' + base64.b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1')
新聞熱點
疑難解答