本篇仍然讲的是用户会话管理
众所周知,REST Web服务的特征之一是无状态。前面讲的 Flask-Login 则是把用户会话储存于客户端的cookie中,这看起来遵守了REST架构的无状态要求,但在REST Web服务中使用cookie不大现实。所以我们用基于HTTP协议的HTTP认证来认证会话
在HTTP认证中,用户密令包含在请求的Authorization首部中(header)
在Flask中,我们使用 Flask-HTTPAuth 来实现它
Flask-HTTPAuth提供了四种Auth方法:HTTPBasicAuth,HTTPTokenAuth,MultiAuth和HTTPDigestAuth,在此我们只使用 HTTPBasicAuth(基本认证),HTTPTokenAuth(令牌认证)和 MultiAuth(混合认证)
1. 初始化拓展
# app.main.authentication.py
from flask_httpauth import HTTPTokenAuth, HTTPBasicAuth, MultiAuth
from ..models import User
auth_token = HTTPTokenAuth(scheme='Bearer') # 留意一下这个 scheme
auth_basic = HTTPBasicAuth()
auth_multi = MultiAuth(auth_token, auth_basic)
与普通拓展不同,初始化 Flask-HTTPAuth 时无需传入app对象,也不需要调用auth.init_app(app)注入应用对象,所以该拓展无需在工厂函数中初始化,直接单独初始化即可
注意Flask-HTTPAuth提供了几种Auth方法
2.创建用户类
# app.models.py
from . import db
from flask import current_app
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired
class AuthFailed(BaseException):
pass
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64))
password = db.Column(db