给我写一个 flask_jwt_extended 实现一个销毁旧token的功能
时间: 2023-05-13 19:05:10 浏览: 184
flask 实现token机制的示例代码
好的,以下是一个基于 flask_jwt_extended 的实现销毁旧 token 的代码示例:
```python
from flask import Flask
from flask_jwt_extended import JWTManager, jwt_required, create_access_token, get_raw_jwt
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret' # 设置 JWT 密钥
jwt = JWTManager(app)
# 模拟一个用户数据库
users = {
'user1': 'password1',
'user2': 'password2'
}
# 模拟一个 token 黑名单
blacklist = set()
# 登录接口,返回一个新的 token
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if not username or not password:
return {'message': 'Missing username or password'}, 400
if username not in users or users[username] != password:
return {'message': 'Invalid username or password'}, 401
access_token = create_access_token(identity=username)
return {'access_token': access_token}, 200
# 保护的接口,需要 token 才能访问
@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
return {'message': 'Hello, {}!'.format(get_jwt_identity())}, 200
# 注销接口,将当前 token 加入黑名单
@app.route('/logout', methods=['DELETE'])
@jwt_required
def logout():
jti = get_raw_jwt()['jti']
blacklist.add(jti)
return {'message': 'Successfully logged out'}, 200
# 检查 token 是否在黑名单中
@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
jti = decrypted_token['jti']
return jti in blacklist
if __name__ == '__main__':
app.run()
```
在这个示例中,我们使用了 flask_jwt_extended 扩展来实现 JWT 认证和授权。用户登录时,我们生成一个新的 token 并返回给客户端。在保护的接口中,我们使用 @jwt_required 装饰器来要求客户端提供有效的 token 才能访问。在注销接口中,我们将当前 token 的 jti(JWT ID)加入黑名单,以便在后续的请求中检查是否在黑名单中。最后,我们使用 @jwt.token_in_blacklist_loader 装饰器来定义一个回调函数,用于检查 token 是否在黑名单中。如果是,则拒绝访问。
阅读全文