flask_jwt_extended 主动销毁token 写一个例子给我

时间: 2023-05-19 18:01:56 浏览: 171
当用户注销或者需要退出登录时,我们需要主动销毁token,以保证用户的安全性。下面是一个使用 flask_jwt_extended 库实现主动销毁token的例子: ```python from flask import Flask from flask_jwt_extended import JWTManager, jwt_required, create_access_token, get_jwt_identity, unset_jwt_cookies app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'super-secret' # 设置JWT的密钥 jwt = JWTManager(app) @app.route('/login', methods=['POST']) def login(): # 用户登录成功后,生成token并返回给客户端 access_token = create_access_token(identity='user_id') return {'access_token': access_token} @app.route('/logout', methods=['POST']) @jwt_required() # 需要登录才能访问 def logout(): # 主动销毁token unset_jwt_cookies() return {'message': 'Logged out successfully'} if __name__ == '__main__': app.run() ``` 在上面的例子中,我们定义了两个路由:`/login` 和 `/logout`。当用户登录成功后,`/login` 路由会生成一个token并返回给客户端。当用户需要退出登录时,`/logout` 路由会主动销毁token,以保证用户的安全性。 需要注意的是,在 `/logout` 路由中,我们使用了 `unset_jwt_cookies()` 方法来主动销毁token。这个方法会清除客户端的token,使其失效。

相关推荐

当用户注销或更改密码时,我们需要销毁旧的 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 时,可以通过设置 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 的代码示例: 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 是否在黑名单中。如果是,则拒绝访问。
当用户使用旧的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 扩展自动提供的,无需我们手动实现。

最新推荐

机械设备行业月周报新产业标准化政策出台提升高端装备检测需求-12页.pdf.zip

行业报告 文件类型:PDF格式 打开方式:直接解压,无需密码

多种查表方式:冒泡排序,插入排序,折半查找法等

多种查表方式:冒泡排序,插入排序,折半查找法等

ChatGPT技术在客户支持领域的应用与效果评估.docx

ChatGPT技术在客户支持领域的应用与效果评估

2023级《程序设计基础课程设计》任务书23.11.28sq修改版 副本.docx

2023级《程序设计基础课程设计》任务书23.11.28sq修改版 副本.docx

基础化工行业研究周报我国研究部署系列举措加快推进新型工业化焦煤烧碱价格上涨-20页.pdf.zip

行业报告 文件类型:PDF格式 打开方式:直接解压,无需密码

超声波雷达驱动(Elmos524.03&Elmos524.09)

超声波雷达驱动(Elmos524.03&Elmos524.09)

ROSE: 亚马逊产品搜索的强大缓存

89→ROSE:用于亚马逊产品搜索的强大缓存Chen Luo,Vihan Lakshman,Anshumali Shrivastava,Tianyu Cao,Sreyashi Nag,Rahul Goutam,Hanqing Lu,Yiwei Song,Bing Yin亚马逊搜索美国加利福尼亚州帕洛阿尔托摘要像Amazon Search这样的产品搜索引擎通常使用缓存来改善客户用户体验;缓存可以改善系统的延迟和搜索质量。但是,随着搜索流量的增加,高速缓存不断增长的大小可能会降低整体系统性能。此外,在现实世界的产品搜索查询中广泛存在的拼写错误、拼写错误和冗余会导致不必要的缓存未命中,从而降低缓存 在本文中,我们介绍了ROSE,一个RO布S t缓存E,一个系统,是宽容的拼写错误和错别字,同时保留传统的缓存查找成本。ROSE的核心组件是一个随机的客户查询ROSE查询重写大多数交通很少流量30X倍玫瑰深度学习模型客户查询ROSE缩短响应时间散列模式,使ROSE能够索引和检

java中mysql的update

Java中MySQL的update可以通过JDBC实现。具体步骤如下: 1. 导入JDBC驱动包,连接MySQL数据库。 2. 创建Statement对象。 3. 编写SQL语句,使用update关键字更新表中的数据。 4. 执行SQL语句,更新数据。 5. 关闭Statement对象和数据库连接。 以下是一个Java程序示例,用于更新MySQL表中的数据: ```java import java.sql.*; public class UpdateExample { public static void main(String[] args) { String

JavaFX教程-UI控件

JavaFX教程——UI控件包括:标签、按钮、复选框、选择框、文本字段、密码字段、选择器等

社交网络中的信息完整性保护

141社交网络中的信息完整性保护摘要路易斯·加西亚-普埃约Facebook美国门洛帕克lgp@fb.com贝尔纳多·桑塔纳·施瓦茨Facebook美国门洛帕克bsantana@fb.com萨曼莎·格思里Facebook美国门洛帕克samguthrie@fb.com徐宝轩Facebook美国门洛帕克baoxuanxu@fb.com信息渠道。这些网站促进了分发,Facebook和Twitter等社交媒体平台在过去十年中受益于大规模采用,反过来又助长了传播有害内容的可能性,包括虚假和误导性信息。这些内容中的一些通过用户操作(例如共享)获得大规模分发,以至于内容移除或分发减少并不总是阻止其病毒式传播。同时,社交媒体平台实施解决方案以保持其完整性的努力通常是不透明的,导致用户不知道网站上发生的任何完整性干预。在本文中,我们提出了在Facebook News Feed中的内容共享操作中添加现在可见的摩擦机制的基本原理,其设计和实现挑战,以�