---------------------------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源创计划”,欢迎正在阅读的你也加入,一块儿分享。