Flask-JWT-Extended
说明
安装
pip install flask-jwt-extended
文档
使用
from flask_jwt_extended import JWTManager
jwt = JWTManager()
jwt.init_app(app)
@auth.route('/', methods=['POST'])
def login():
username = request.json.get('username')
password = request.json.get('password')
if not username or not password:
return jsonify(code='40101', msg='缺少用户名或密码'), 401
user = User.query.filter_by(username=username, status=UserStatus.NORMAL).first()
if not user:
return jsonify(code='40102', msg='无效的用户名'), 401
elif not user.verify_password(password):
return jsonify(code='40103', msg='无效的密码'), 401
access_token = create_access_token(identity=user.id)
refresh_token = create_refresh_token(identity=user.id)
cache.set(get_jti(access_token), 'false',
current_app.config['JWT_ACCESS_TOKEN_EXPIRES'])
cache.set(get_jti(refresh_token), 'false',
current_app.config['JWT_REFRESH_TOKEN_EXPIRES'])
return jsonify(
code='20100',
msg='登录成功',
access_token=access_token,
refresh_token=refresh_token
), 201
@auth.route('/', methods=['DELETE'])
@jwt_required
def logout():
access_jti = get_raw_jwt()['jti']
cache.set(access_jti, 'true',
current_app.config['JWT_ACCESS_TOKEN_EXPIRES'])
cache.delete(str(get_jwt_identity()))
return jsonify(msg='退出登录成功')
@auth.before_app_request
def authentication():
if request.method == 'OPTIONS':
return
elif request.path in app_config['URL_WHITE_LIST']:
if request.method in app_config['URL_WHITE_LIST'][request.path]:
return
elif request.path.startswith('/swagger') or request.path == '/':
return
@jwt_required
def verify_token():
pass
verify_token()
@auth.route('/', methods=['PUT'])
@jwt_refresh_token_required
def refresh():
access_token = create_access_token(identity=get_jwt_identity())
access_jti = get_jti(access_token)
cache.set(access_jti, 'false',
current_app.config['JWT_ACCESS_TOKEN_EXPIRES'])
return jsonify(code='20100', access_token=access_token), 201
@jwt.unauthorized_loader
def unauthorized_callback(e):
return jsonify(code='40104', msg=e), 401
@jwt.expired_token_loader
def expired_token_callback(expired_token):
token_type = expired_token['type']
msg = 'The {} token has expired'.format(token_type)
if token_type == 'access':
return jsonify(code='40105', msg=msg)
else:
return jsonify(code='40106', msg=msg), 401
@jwt.invalid_token_loader
def invalid_token_callback(e):
return jsonify(code='40107', msg=e)
@jwt.revoked_token_loader
def revoked_token_callback():
return jsonify(code='40108', msg='The token has been revoked'), 401
@jwt.token_in_blacklist_loader
def token_in_blacklist_callback(decrypted_token):
jti = decrypted_token['jti']
entry = cache.get(jti)
if entry is None:
return True
return entry == 'true'