flask_jwt_extended 生成新的token的同时销毁旧的token

时间: 2023-05-13 12:05:09 浏览: 36
可以使用 `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。

相关推荐

好的,以下是一个使用 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 扩展自动提供的,无需我们手动实现。
当用户注销或更改密码时,我们需要销毁旧的 token,以确保安全性。下面是一个使用 flask_jwt_extended 库的例子: python 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 @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": "Invalid username or password"}), 401 # 创建 token access_token = create_access_token(identity=username) return jsonify(access_token=access_token), 200 # 创建一个路由,用于注销 token @app.route('/logout', methods=['DELETE']) @jwt_required def logout(): jti = get_raw_jwt()['jti'] # 获取 token 的 jti 值 # 将 jti 值添加到黑名单中 blacklist.add(jti) return jsonify({"msg": "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() 在上面的例子中,我们创建了两个路由,一个用于获取 token,另一个用于注销 token。当用户注销时,我们将 token 的 jti 值添加到黑名单中,以确保该 token 无法再次使用。在每次请求时,我们使用 @jwt.token_in_blacklist_loader 装饰器来验证 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 是否在黑名单中。如果是,则拒绝访问。

最新推荐

k8s 1.24.0镜像下载

k8s 1.24.0镜像下载 在linux使用unzip 解压 k8s-v1.24.0.zip后再进行导入镜像。

使用MySQL数据库创建表

使用MySQL数据库创建表

总结的业界多种架构种类风格.xlsx

总结的业界多种架构种类风格

JSP基于SSM任务众包系统设计可升级SpringBoot毕业源码案例设计.zip

适用工作项目、毕业设计,课程设计,项目源码均经过助教老师测试,运行无误,欢迎下载 -------- 下载后请首先打开README.md文件(如有)

亲子周末游_市场及竞品分析.docx

亲子周末游_市场及竞品分析.docx

数据结构1800试题.pdf

你还在苦苦寻找数据结构的题目吗?这里刚刚上传了一份数据结构共1800道试题,轻松解决期末挂科的难题。不信?你下载看看,这里是纯题目,你下载了再来私信我答案。按数据结构教材分章节,每一章节都有选择题、或有判断题、填空题、算法设计题及应用题,题型丰富多样,共五种类型题目。本学期已过去一半,相信你数据结构叶已经学得差不多了,是时候拿题来练练手了,如果你考研,更需要这份1800道题来巩固自己的基础及攻克重点难点。现在下载,不早不晚,越往后拖,越到后面,你身边的人就越卷,甚至卷得达到你无法想象的程度。我也是曾经遇到过这样的人,学习,练题,就要趁现在,不然到时你都不知道要刷数据结构题好还是高数、工数、大英,或是算法题?学完理论要及时巩固知识内容才是王道!记住!!!下载了来要答案(v:zywcv1220)。

语义Web动态搜索引擎:解决语义Web端点和数据集更新困境

跟踪:PROFILES数据搜索:在网络上分析和搜索数据WWW 2018,2018年4月23日至27日,法国里昂1497语义Web检索与分析引擎Semih Yumusak†KTO Karatay大学,土耳其semih. karatay.edu.trAI 4 BDGmbH,瑞士s. ai4bd.comHalifeKodazSelcukUniversity科尼亚,土耳其hkodaz@selcuk.edu.tr安德烈亚斯·卡米拉里斯荷兰特文特大学utwente.nl计算机科学系a.kamilaris@www.example.com埃利夫·尤萨尔KTO KaratayUniversity科尼亚,土耳其elif. ogrenci.karatay.edu.tr土耳其安卡拉edogdu@cankaya.edu.tr埃尔多安·多杜·坎卡亚大学里扎·埃姆雷·阿拉斯KTO KaratayUniversity科尼亚,土耳其riza.emre.aras@ogrenci.karatay.edu.tr摘要语义Web促进了Web上的通用数据格式和交换协议,以实现系统和机器之间更好的互操作性。 虽然语义Web技术被用来语义注释数据和资源,更容易重用,这些数据源的特设发现仍然是一个悬 而 未 决 的 问 题 。 流 行 的 语 义 Web �

matlabmin()

### 回答1: `min()`函数是MATLAB中的一个内置函数,用于计算矩阵或向量中的最小值。当`min()`函数接收一个向量作为输入时,它返回该向量中的最小值。例如: ``` a = [1, 2, 3, 4, 0]; min_a = min(a); % min_a = 0 ``` 当`min()`函数接收一个矩阵作为输入时,它可以按行或列计算每个元素的最小值。例如: ``` A = [1, 2, 3; 4, 0, 6; 7, 8, 9]; min_A_row = min(A, [], 2); % min_A_row = [1;0;7] min_A_col = min(A, [],

TFT屏幕-ILI9486数据手册带命令标签版.pdf

ILI9486手册 官方手册 ILI9486 is a 262,144-color single-chip SoC driver for a-Si TFT liquid crystal display with resolution of 320RGBx480 dots, comprising a 960-channel source driver, a 480-channel gate driver, 345,600bytes GRAM for graphic data of 320RGBx480 dots, and power supply circuit. The ILI9486 supports parallel CPU 8-/9-/16-/18-bit data bus interface and 3-/4-line serial peripheral interfaces (SPI). The ILI9486 is also compliant with RGB (16-/18-bit) data bus for video image display. For high speed serial interface, the ILI9486 also provides one data and clock lane and supports up to 500Mbps on MIPI DSI link. And also support MDDI interface.

数据搜索和分析

跟踪:PROFILES数据搜索:在网络上分析和搜索数据WWW 2018,2018年4月23日至27日,法国里昂1485表征数据集搜索查询艾米莉亚·卡普尔扎克英国南安普敦大学开放数据研究所emilia. theodi.org珍妮·坦尼森英国伦敦开放数据研究所jeni@theodi.org摘要在Web上生成和发布的数据量正在迅速增加,但在Web上搜索结构化数据仍然存在挑战。在本文中,我们探索数据集搜索分析查询专门为这项工作产生的通过众包-ING实验,并比较它们的搜索日志分析查询的数据门户网站。搜索环境的变化以及我们给人们的任务改变了生成的查询。 我们发现,在我们的实验中发出的查询比数据门户上的数据集的搜索查询要长得多。 它们还包含了七倍以上的地理空间和时间信息的提及,并且更有可能被结构化为问题。这些见解可用于根据数据集搜索的特定信息需求和特征关键词数据集搜索,�