flask_jwt_extended 生成新的token的同时销毁旧的token
时间: 2023-05-13 16:05:09 浏览: 162
可以使用 `flask_jwt_extended` 提供的 `create_access_token` 函数生成新的 token,同时使用 `jwt_manager` 提供的 `jwt_manager._set_blacklist_revoked_token_callback` 函数将旧的 token 加入黑名单并销毁。具体代码如下:
```python
from flask_jwt_extended import create_access_token, jwt_manager
# 生成新的 token
new_token = create_access_token(identity=user_id)
# 将旧的 token 加入黑名单并销毁
@jwt_manager._set_blacklist_revoked_token_callback
def revoke_token_callback(jti, *args, **kwargs):
blacklist.add(jti)
revoke_token_callback(old_token["jti"])
```
其中,`blacklist` 可以是一个 set,用于存储已经被销毁的 token 的 jti。
相关问题
flask_jwt_extended 生成新的token的同时销毁旧的token 写一个例子给我
当使用 flask_jwt_extended 生成新的 token 时,可以通过设置 JWT_BLACKLIST_ENABLED 为 True 来启用 token 黑名单功能,从而实现销毁旧的 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 密钥
app.config['JWT_BLACKLIST_ENABLED'] = True # 启用 token 黑名单功能
app.config['JWT_BLACKLIST_TOKEN_CHECKS'] = ['access'] # 只对 access token 进行黑名单检查
jwt = JWTManager(app)
# 模拟一个用户登录,生成 access token 和 refresh token
@app.route('/login', methods=['POST'])
def login():
access_token = create_access_token(identity='user_id')
refresh_token = 'refresh_token'
return {'access_token': access_token, 'refresh_token': refresh_token}
# 模拟一个需要认证的 API
@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
return {'message': 'Hello, World!'}
# 在请求头中添加 access token,访问受保护的 API
@app.route('/test', methods=['GET'])
def test():
headers = {'Authorization': 'Bearer access_token'}
response = app.test_client().get('/protected', headers=headers)
return response.json
# 在请求头中添加 refresh token,生成新的 access token 并销毁旧的 access token
@app.route('/refresh', methods=['POST'])
def refresh():
# 检查 refresh token 是否有效
# ...
# 生成新的 access token
new_access_token = create_access_token(identity='user_id')
# 将旧的 access token 加入黑名单
jti = get_raw_jwt()['jti']
jwt._set_blacklist(jti)
return {'access_token': new_access_token}
```
在上面的例子中,当用户登录成功后,会生成一个 access token 和一个 refresh token。在访问受保护的 API 时,需要在请求头中添加 access token。在生成新的 access token 时,需要在请求头中添加 refresh token,并将旧的 access token 加入黑名单。
flask_jwt_extended 生成新的token的同时销毁旧的token 在Flask 蓝图中 写一个例子给我
当用户使用旧的token进行请求时,我们需要先验证旧的token是否有效,如果有效则生成新的token并返回给用户,同时销毁旧的token。以下是一个使用 flask_jwt_extended 实现这个功能的例子:
```python
from flask import Blueprint, jsonify
from flask_jwt_extended import jwt_required, create_access_token, get_raw_jwt, get_jwt_identity, unset_jwt_cookies
bp = Blueprint('auth', __name__)
@bp.route('/refresh_token', methods=['POST'])
@jwt_required
def refresh_token():
current_user = get_jwt_identity()
access_token = create_access_token(identity=current_user)
jti = get_raw_jwt()['jti']
unset_jwt_cookies()
return jsonify({'access_token': access_token}), 200, {'Set-Cookie': f'access_token_cookie={access_token}; HttpOnly; SameSite=None; Secure', 'Set-Cookie': f'jti_cookie={jti}; HttpOnly; SameSite=None; Secure'}
```
在这个例子中,我们使用了 Flask 的蓝图来组织代码。我们定义了一个名为 auth 的蓝图,并在其中定义了一个名为 refresh_token 的路由。这个路由需要用户提供一个有效的 token 才能访问,因为我们需要使用旧的 token 来生成新的 token。
在路由函数中,我们首先获取当前用户的身份信息,然后使用 create_access_token 函数生成新的 token。接着,我们使用 get_raw_jwt 函数获取旧的 token 的 jti 值,并使用 unset_jwt_cookies 函数销毁旧的 token。最后,我们将新的 token 和 jti 值返回给用户,并设置了两个 cookie,一个是 access_token_cookie,用来存储新的 token,另一个是 jti_cookie,用来存储旧的 token 的 jti 值。
这样,当用户使用旧的 token 进行请求时,我们会先验证旧的 token 是否有效,如果有效则生成新的 token 并返回给用户,同时销毁旧的 token。
阅读全文