---------------------------html
點擊藍字關注這個神奇的公衆號~python
導言算法
有些網站在打開時就會彈出登陸提示框,直接提示你輸入用戶名和密碼,驗證成功才能查看頁面。這樣的驗證使用的是HTTPAuth驗證方式,若是想在本身的網站設置這樣的驗證就須要使用Python模塊flask_HTTPAuth,下面咱們就來詳細看一下這個模塊的使用。數據庫
flask_httpauth模塊封裝瞭如下幾種簡單的認證方式:基本認證(Basic Authentication),摘要認證(Digest Authentication),標誌認證(Token Authentication)。flask
爲了保護根路徑,下面的例子使用基本認證。
安全
from flask import Flask
from flask_httpauth import HTTPBasicAuth
app = Flask(__name__)
auth = HTTPBasicAuth()
users = {
"john": "hello",
"susan": "bye"
}
get_password .
def get_pw(username):
if username in users:
return users.get(username)
return None
route('/') .
login_required .
def index():
return "Hello, %s!" % auth.username()
if __name__ == '__main__':
app.run()
調用get_password方法時須要返回一個和用戶名相關聯的密碼,當且僅當get_password(用戶名) == 密碼時驗證才經過。服務器
若是密碼以哈希的方式存儲在用戶數據庫中,那麼就須要調用另外一個方法。微信
hash_password .
def hash_pw(password):
return md5(password).hexdigest()
當且僅當get_password(用戶名) == hash_password(密碼)時驗證纔會經過。cookie
若是哈希算法要求知道用戶名,那麼調用的時候能夠攜帶兩個參數而不是一個參數:app
hash_password .
def hash_pw(username, password):
salt = get_salt(username)
return hash(password, salt)
從靈活性的角度考慮,get_password和hash_password兩個方法能夠統一的替代爲verify_password方法:
verify_password .
def verify_pw(username, password):
return call_custom_verify_function(username, password)
接下來的例子和上面的差很少,可是使用的是摘要認證:
from flask import Flask
from flask_httpauth import HTTPDigestAuth
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret key here'
auth = HTTPDigestAuth()
users = {
"john": "hello",
"susan": "bye"
}
get_password .
def get_pw(username):
if username in users:
return users.get(username)
return None
route('/') .
login_required .
def index():
return "Hello, %s!" % auth.username()
if __name__ == '__main__':
app.run()
摘要認證算法要求發送一個口令到客戶端用來加密密碼爲了安全的傳輸。當密碼在服務器解密時口令須要再次被使用。因此,口令信息須要被保存便於之後從新調用。
默認狀況下,口令被保存在Flask會話中,當使用會話存儲時,爲了確保更安全的傳輸,要求服務器端的會話被使用而不是使用默認的基於會話的Flask的cookie,由於這能夠確保當口令在傳輸過程當中不會被截獲。Flask-Session和Flask-KVSession擴展包是實現服務端會話的良好的選擇。
做爲使用服務器端會話的替代方案,應用程序能夠實現本身的口令數據生成和存儲。爲此,應用程序須要實現四個回調函數:
generate_nonce .
def generate_nonce():
"""返回要用於此客戶端的當前值。"""
pass
generate_opaque .
def generate_opaque():
"""返回要用於此客戶端的不透明值。"""
pass
verify_nonce .
def verify_nonce(nonce):
"""驗證客戶端發送的當前值是否正確。"""
pass
verify_opaque .
def verify_opaque(opaque):
"""驗證客戶端發送的不透明值是否正確。"""
pass
想知道當前值和不透明值是什麼以及如何在摘要認證中使用它們,參考:http://tools.ietf.org/html/rfc2617#section-3.2.1。
接下來的例子使用一個自定義的經過一個標誌保護根路徑的HTTP認證方式:
from flask import Flask, g
from flask_httpauth import HTTPTokenAuth
app = Flask(__name__)
auth = HTTPTokenAuth(scheme='Token')
tokens = {
"secret-token-1": "john",
"secret-token-2": "susan"
}
verify_token .
def verify_token(token):
if token in tokens:
g.current_user = tokens[token]
return True
return False
route('/') .
login_required .
def index():
return "Hello, %s!" % g.current_user
if __name__ == '__main__':
app.run()
HTTPTokenAuth一種通用身份驗證處理程序,可與非標準身份驗證方案一塊兒使用,其方案名稱做爲構造函數中的參數。在上面的例子中,由服務器提供的WWW-驗證頭將會使用Token做爲解決方案:
WWW-Authenticate: Token realm="Authentication Required"
調用verify_token在驗證頭接收客戶端提供的身份驗證憑據。這能夠是一個簡單的東西,或者能夠包含多個函數必須解析並從字符串中提取的參數。
本文分享自微信公衆號 - Python機器學習算法說書人(Python-ML-Algorithm)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。