flask_jwt_extended 销毁旧的token给我写一个例子

时间: 2023-05-13 11:05:11 浏览: 47
当用户注销或更改密码时,我们需要销毁旧的 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 是否在黑名单中。如果是,则拒绝访问。
当使用 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 加入黑名单。
当用户使用旧的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 扩展自动提供的,无需我们手动实现。

最新推荐

某电机修造厂变电所一次系统设计

本次设计是我们的毕业设计,本次设计的变电所的类型为地区变电所,是为了满足市区生产和生活的要求,根据老师给出的设计资料和要求,结合所学的基础知识和文献资料所做的。通过本设计,对以前所学的知识加强了理解和掌握,复习巩固专业课程学习的相关内容并进行课题实践,锻炼、培养对110kV变电所的设计能力。从总体上掌握了电力工程设计的过程,并熟悉了-些设计方法,为以后从事电力工程设计工作打下一定的基础。 根据110kV变电所为研究方向,根据变电所的原始数据设计其电气接线图、变压器选型 、负荷计算、短路电流计算、继电保护方案设计以及防雷接地设计等相关研究。

爱心代码.exe

爱心代码.exe

斗鱼CEO陈少杰被捕;币安被罚逾40亿美元,CEO赵长鹏辞职;特斯拉回应涨价4次;东方甄选向母公司新东方出售教育业务

互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,互联网资讯、互联网快报,

华为Mate 60系列全款销售秒光;Arm将于9月14日在纳斯达克挂牌上市

互联网发展快报,最新互联网消息 互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息互联网发展快报,最新互联网消息

基于jsp的酒店管理系统源码数据库论文.doc

基于jsp的酒店管理系统源码数据库论文.doc

5G技术在医疗保健领域的发展和影响:全球疫情COVID-19问题

阵列14(2022)1001785G技术在医疗保健领域不断演变的作用和影响:全球疫情COVID-19问题MdMijanurRahmana,Mh,FatemaKhatunb,SadiaIslamSamia,AshikUzzamanaa孟加拉国,Mymensingh 2224,Trishal,Jatiya Kabi Kazi Nazrul Islam大学,计算机科学与工程系b孟加拉国Gopalganj 8100,Bangabandhu Sheikh Mujibur Rahman科技大学电气和电子工程系A R T I C L E I N F O保留字:2019冠状病毒病疫情电子健康和移动健康平台医疗物联网(IoMT)远程医疗和在线咨询无人驾驶自主系统(UAS)A B S T R A C T最新的5G技术正在引入物联网(IoT)时代。 该研究旨在关注5G技术和当前的医疗挑战,并强调可以在不同领域处理COVID-19问题的基于5G的解决方案。本文全面回顾了5G技术与其他数字技术(如人工智能和机器学习、物联网对象、大数据分析、云计算、机器人技术和其他数字平台)在新兴医疗保健应用中的集成。从文献中

def charlist(): li=[] for i in range('A','Z'+1): li.append(i) return li

这段代码有误,因为 `range()` 函数的第一个参数应该是整数类型而不是字符串类型,应该改为 `range(ord('A'), ord('Z')+1)`。同时,还需要将 `ord()` 函数得到的整数转化为字符类型,可以使用 `chr()` 函数来完成。修改后的代码如下: ``` def charlist(): li = [] for i in range(ord('A'), ord('Z')+1): li.append(chr(i)) return li ``` 这个函数的作用是返回一个包含大写字母 A 到 Z 的列表。

需求规格说明书1

1.引言1.1 编写目的评了么项目旨在提供一个在线评分系统,帮助助教提高作业评分效率,提供比现有方式更好的课堂答辩评审体验,同时减轻助教的工作量并降低助教工作复

人工免疫系统在先进制造系统中的应用

阵列15(2022)100238人工免疫系统在先进制造系统中的应用RuiPinto,Gil GonçalvesCNOEC-系统和技术研究中心,Rua Dr. Roberto Frias,s/n,office i219,4200-465,Porto,Portugal波尔图大学工程学院,Rua Dr. Roberto Frias,s/n 4200-465,Porto,PortugalA R T I C L E I N F O保留字:人工免疫系统自主计算先进制造系统A B S T R A C T近年来,先进制造技术(AMT)在工业过程中的应用代表着不同的先进制造系统(AMS)的引入,促使企业在面对日益增长的个性化产品定制需求时,提高核心竞争力,保持可持续发展。最近,AMT引发了一场新的互联网革命,被称为第四次工业革命。 考虑到人工智能的开发和部署,以实现智能和自我行为的工业系统,自主方法允许系统自我调整,消除了人为干预管理的需要。本文提出了一个系统的文献综述人工免疫系统(AIS)的方法来解决多个AMS问题,需要自治的

DIANA(自顶向下)算法处理鸢尾花数据集,用轮廓系数作为判断依据,其中DIANA算法中有哪些参数,请输出。 对应的参数如何取值,使得其对应的轮廓系数的值最高?针对上述问题给出详细的代码和注释

DIANA(自顶向下)算法是一种聚类算法,它的参数包括: 1. k值:指定聚类簇的数量,需要根据实际问题进行设置。 2. 距离度量方法:指定计算样本之间距离的方法,可以选择欧氏距离、曼哈顿距离等。 3. 聚类合并准则:指定合并聚类簇的准则,可以选择最大类间距离、最小类内距离等。 为了让轮廓系数的值最高,我们可以通过调整这些参数的取值来达到最优化的效果。具体而言,我们可以采用网格搜索的方法,对不同的参数组合进行测试,最终找到最优的参数组合。 以下是使用DIANA算法处理鸢尾花数据集,并用轮廓系数作为判断依据的Python代码和注释: ```python from sklearn impo