给我写一个 flask_jwt_extended 使用 token_in_blocklist_loader 的例子
时间: 2023-05-13 14:05:11 浏览: 246
Python库 | flask_jwt_consumer-1.1.0-py3-none-any.whl
好的,以下是一个使用 flask_jwt_extended 和 token_in_blocklist_loader 的例子:
```python
from flask import Flask
from flask_jwt_extended import JWTManager, jwt_required, create_access_token, get_jwt_identity, get_raw_jwt
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret' # 设置 JWT 密钥
jwt = JWTManager(app)
# 模拟一个 token 黑名单
blocklist = set()
# 定义 token_in_blocklist_loader 回调函数
@jwt.token_in_blocklist_loader
def check_if_token_in_blocklist(jwt_header, jwt_payload):
jti = jwt_payload['jti']
return jti in blocklist
# 定义登录接口
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if username != 'admin' or password != 'admin':
return jsonify({"msg": "Bad username or password"}), 401
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token), 200
# 定义需要 token 认证的接口
@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
current_user = get_jwt_identity()
return jsonify(logged_in_as=current_user), 200
# 定义注销接口
@app.route('/logout', methods=['DELETE'])
@jwt_required
def logout():
jti = get_raw_jwt()['jti']
blocklist.add(jti)
return jsonify({"msg": "Successfully logged out"}), 200
if __name__ == '__main__':
app.run()
```
这个例子中,我们定义了一个 token 黑名单 `blocklist`,并在 `token_in_blocklist_loader` 回调函数中检查 token 是否在黑名单中。当用户注销时,我们将该 token 的 `jti` 添加到黑名单中。这样,即使该 token 没有过期,也无法再次使用。
阅读全文