优秀的Python身份验证包很多,但没有一个能实现所有功能。此部分介绍的身份验证方案将使用多个包,并编写胶水代码,让不同的包良好协作。此部分使用的包如下:
- Flask-Login:管理已登录用户的用户会话;
- Werkzeug:计算密码散列值并进行核对;
- itsdangerous:生成并核对加密安全令牌;
除了身份验证相关的包之外,此部分还将使用以下常规用途的扩展:
- Flask-Mail:发送与身份验证相关的电子邮件;
- Flask-Bootstrap:HTML模板;
- Flask-WTF:web表单;
一. 密码安全性
要保证数据库中用户密码的安全,关键在于不存储密码本身,而是存储密码的散列值。计算密码散列值的函数接受密码作为输入,输出一个和原始密码没有任何关系的字符序列。其中计算密码散列值的函数是可复现的,只要输入一样,结果就一样。
二. 使用Werkzeug计算密码散列值
Werkzeug中security模块能够很方便的实现密码散列值的计算:
-
generate_password_hash(password, method=pbkdf2:sha1, salt_length=8):将原始密码作为输入,以字符串形式输出密码的散列值;method和salt_length的默认值即可满足大多数需求;
-
check_password_hash(hash, password):比较散列值和用户输入的密码,返回值为True表示密码正确;
app/models.py:在User模型中加入密码散列:
from werkzeug.security import generate_password_hash, check_password_hash
from . import db
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)