Flask-JWT重刷

席兴平
2023-12-01

JWT重刷

access_token如果设为一直有效,无法防止用户盗用

access_token有过期时间,如果过期了,让用户重新登录有时候感受不太好

我们需要一个为已登录用户重新刷新access_token的机制

一种方式是将过期时间配置的长一点,配置JWT ACCESS TOKEN过期时间 (默认是15分钟)

# JWT ACCESS TOKEN过期时间(单位秒)
JWT_ACCESS_TOKEN_EXPIRES=300

编写过期错误处理器
在application.common.error_handler中加入

@jwt.expired_token_loader
def expired_token_callback(expired_token):
    token_type = expired_token['type']
    return jsonify({
        'code': ERROR_PARAM,
        'msg': 'The {} token has expired'.format(token_type)
    })

第二种方式:生成refresh token

# application.api.users.views

from flask_jwt_extended import jwt_required, create_access_token, jwt_refresh_token_required, create_refresh_token, get_jwt_identity

# login 方法里面
        jwt_token = create_access_token(identity=username)

        refresh_token = create_refresh_token(identity=username)

        return jsonify({'code': SUCCESS, 'message': '成功', 'token': jwt_token, 'refresh_token': refresh_token})        

刷新token的方法 (只有用refresh token能调用)

@api_users.route('/refresh', methods=['POST'])
@jwt_refresh_token_required
def refresh():
    current_user = get_jwt_identity()
    ret = {
        'access_token': create_access_token(identity=current_user)
    }
    return jsonify(ret), 200

刷新token的过期时间默认为30天,可以配置(单位是秒)

JWT_REFRESH_TOKEN_EXPIRES=xxx

新鲜度模式 (防止刷新token被盗后刷新生成token问题)

# 刷新生成的用这个fresh=False
new_token = create_access_token(identity=current_user, fresh=False)

# 登录生成的 fresh=True

如果只有新鲜的可以访问,也就是说只有登录生成的token才能执行,刷新生成的不能访问,视图方法上加装饰器,比如说下单之类的
@fresh_jwt_required

 类似资料: