flask_jwt_extended 登录生成新的token的同时销毁旧的token 在Flask 蓝图中 写一个例子给我
时间: 2023-05-13 20:05:10 浏览: 92
好的,以下是一个使用 Flask 蓝图和 flask_jwt_extended 扩展的例子,可以在用户登录时生成新的 JWT token,并在旧的 token 过期或被撤销时自动销毁旧的 token:
```python
from flask import Blueprint, jsonify, request
from flask_jwt_extended import create_access_token, jwt_required, get_raw_jwt, JWTManager
auth_bp = Blueprint('auth', __name__)
# 初始化 JWTManager
jwt = JWTManager()
# 在蓝图中注册 JWTManager
jwt.init_app(auth_bp)
# 模拟一个用户数据库
users = {
'user1': {
'password': 'password1',
'roles': ['admin']
},
'user2': {
'password': 'password2',
'roles': ['user']
}
}
# 登录路由
@auth_bp.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 jsonify({'msg': 'Missing username or password'}), 400
if username not in users or users[username]['password'] != password:
return jsonify({'msg': 'Invalid username or password'}), 401
# 生成新的 JWT token
access_token = create_access_token(identity=username)
# 返回新的 token
return jsonify({'access_token': access_token}), 200
# 保护的路由
@auth_bp.route('/protected', methods=['GET'])
@jwt_required
def protected():
return jsonify({'msg': 'Hello, {}!'.format(get_raw_jwt()['identity'])}), 200
```
在上面的例子中,我们定义了一个名为 `auth_bp` 的 Flask 蓝图,其中包含了两个路由:`/login` 和 `/protected`。
在 `/login` 路由中,我们接受用户提交的用户名和密码,并检查它们是否匹配我们模拟的用户数据库中的记录。如果匹配成功,我们使用 `create_access_token` 函数生成一个新的 JWT token,并将其返回给用户。
在 `/protected` 路由中,我们使用 `@jwt_required` 装饰器来保护这个路由,只有在用户提供有效的 JWT token 时才能访问。如果用户提供了有效的 token,我们将返回一个简单的欢迎消息,其中包含了 JWT token 中的身份信息。
当用户在 `/login` 路由中生成新的 JWT token 时,旧的 token 将自动失效。这是因为每个 JWT token 都包含了一个唯一的 `jti`(JWT ID)字段,当旧的 token 过期或被撤销时,我们可以使用这个字段来标记它已经失效。这个功能是由 flask_jwt_extended 扩展自动提供的,无需我们手动实现。