托肯黑瓶延伸
flask-blacklist的Python项目详细描述
烧瓶黑名单
什么
这是一个烧瓶扩展,设计用于flask_sqlalchemy
和flask_pratorian
黑名单令牌!
它将黑名单jwt的jti值存储在内存存储中,允许在没有 数据库调用。但是,当令牌被列入黑名单时,它也会被持久化到数据库中。
为什么
- 在不使用redis的情况下模拟redis存储!_
- 这几乎肯定比redis慢(毕竟是python)。
- 为什么不呢,这是一个更好地了解flask和相关库的借口。
如何
你正在使用virtualenv,对吧?
pip install flask-blacklist
然后在app factory函数中,在初始化orm之后初始化Blacklist
。
# In global scope
from flask_blacklist import Blacklist, is_blacklisted
db = SQLAlchemy()
guard = Praetorian()
bl = Blacklist()
# In the app factory function
app = Flask(__name__)
db.init_app(app)
from app.models import Token, User
bl.init_app(app, Token) # Initialize after your ORM
# is_blacklisted is a helper function that Praetorian uses to determine if a token has been blacklisted
guard.init_app(app, User, is_blacklisted)
令牌数据库模型需要有两种不同的类方法:
Token.blacklist_jti
- 接受一个参数,即从jwt中提取的
jti
字符串 - 此方法调用将黑名单中的
jti
字符串持久化到数据库。
- 接受一个参数,即从jwt中提取的
Token.get_blacklisted
- 应返回数据库中已列入黑名单的令牌列表
- 令牌返回应该有一个
jti
属性,该属性包含从要黑名单的令牌中提取的字符串
然后,在需要使令牌失效的路由中:
@auth_blueprint.route("/v1/auth/token", methods=["DELETE"])
@auth_required
def invalidate_token():
token = guard.read_token_from_header()
jti = guard.extract_jwt_token(token)["jti"]
bl.blacklist_jti(jti)
rv, code = {"success": True, "message": "token invalidated"}, 200
return jsonify(rv), code
版权所有2019 Alexander Potts,麻省理工学院许可证。