今天继续来弄flask的东东,jwt。用来做登录认证。
项目整合模块:代码在后文附上
flask_jwt_extended 附上官方文档地址:地址
一基本使用:
安装:
pip install flask-jwt-extended
安装好后,导入模块
注册到flask app实例中
只需要在视图函数,即接口处加上@fresh_jwt_required,或者@jwt_required装饰器,jwt 就可以使用了。接下来分析下,工作流程。
二.工作流程
先来分析下源码,
flask_jwt_extended 创建好JWTManager实例后,会默认加载好自身的回调函数,回调函数也就是当触发我们要访问的条件时,即满足触发条件,就会调用这个函数。比如我们用了,@fresh_jwt_required 来装饰我们的接口,当我们访问这个接口时,就会执行这个回调函数。有各种回调函数进行来验证和解析我们的token,所以使用的时候很方便。从源码中可以看出,有两个回调函数没有进行调用。黑名单验证,这个可以自己重写,重写就是再写一个装饰器覆盖而已,进行黑名单的token限制访问,具体可以看本文代码。
@main_bp.route('/user', methods=(['POST']))
@fresh_jwt_required
def get_user():
# 通过flask 的request 获取前端传过来的json数据
json = request.json username = json.get('username')
user = User(username=username)
return jsonify(user.username),200
所以简单来说,flask_jwt_extended这个的工作流程就是 实例化JWTManager——>注册到app实例中——>对接口进行装饰器保护——>回调函数进行验证解析,保护接口安全,如有必要进行回调函数重写
web程序完整的流程:
1.HTTP访问登录,生成token(通过flask_jwt_extended的现有相关方法生成),返回。
2.访问其它接口,携带1中生成的token,flask_jwt_extended对保护的接口(视图函数)通过回调函数进行token验证解析。
3.通过2的token验证,访问视图函数,返回数据。
三.补充jwt原理
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
头部进行BASE64编码,头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
载荷就是存放有效信息的地方,有效信息包含三个部分:
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base64后的)
payload(base64后的)
secret
这个部分需要(1)base64加密后的header(2)base64加密后的payload
最后使用.连接两者组成的最终字符串,进行header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第 三部分。所以要保护好secret。flask_jwt_extended里也提供了动态的加密方法,用不同的secret进行加密的回调方法,只要重写就会了。重写就是再写一个装饰器覆盖而已。具体可以看源码和文档。
flask_jwt_extended已经给flask app实例添加了默认配置。通过app.config可以修改
# Secret key to sign JWTs with. Only used if a symmetric algorithm is
# used (such as the HS* algorithms). We will use the app secret key
# if this is not set.
app.config.setdefault('JWT_SECRET_KEY', None)
以上就是flask_jwt_extended的运行原理了。