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

时间: 2023-05-13 14:05:11 浏览: 109
当用户注销或更改密码时,我们需要使旧的token失效,以确保安全性。下面是一个使用 flask_jwt_extended 蓝图销毁旧的token的例子: ```python from flask import Blueprint from flask_jwt_extended import jwt_required, get_jwt_identity, get_raw_jwt auth_bp = Blueprint('auth', __name__) @auth_bp.route('/logout', methods=['POST']) @jwt_required def logout(): jti = get_raw_jwt()['jti'] # 将 jti 添加到黑名单中 # 这样,所有使用该 jti 的 token 都将失效 # 你可以使用 redis 或者数据库来实现黑名单 # 这里只是一个简单的示例 BLACKLIST.add(jti) return {'message': '注销成功'}, 200 ``` 在上面的例子中,我们使用了 flask_jwt_extended 提供的 get_raw_jwt() 函数来获取当前 token 的 jti(JWT ID)值,然后将其添加到一个黑名单中,以使所有使用该 jti 的 token 失效。BLACKLIST 可以是一个 set 或者一个列表,用于存储所有失效的 jti 值。 请注意,这只是一个简单的示例,实际应用中你需要更加严格的安全措施来保护用户的隐私和数据安全。

相关推荐

当用户注销或更改密码时,我们需要销毁旧的 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 是否在黑名单中。如果是,则拒绝访问。
当用户使用旧的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 扩展自动提供的,无需我们手动实现。
好的,以下是一个使用 flask_jwt_extended 区分普通用户和管理员用户的例子: python from flask import Flask, jsonify from flask_jwt_extended import JWTManager, jwt_required, get_jwt_identity, get_raw_jwt app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'super-secret' # 设置 JWT 密钥 jwt = JWTManager(app) # 模拟用户数据 users = [ {'id': 1, 'username': 'user1', 'password': 'password1', 'is_admin': False}, {'id': 2, 'username': 'user2', 'password': 'password2', 'is_admin': True} ] # 登录接口 @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 jsonify({'msg': 'Missing username or password'}), 400 user = next((u for u in users if u['username'] == username and u['password'] == password), None) if not user: return jsonify({'msg': 'Invalid username or password'}), 401 # 生成 JWT token access_token = create_access_token(identity=user['id'], user_claims={'is_admin': user['is_admin']}) return jsonify({'access_token': access_token}), 200 # 普通用户接口 @app.route('/user', methods=['GET']) @jwt_required def user(): user_id = get_jwt_identity() return jsonify({'msg': f'Hello user {user_id}!'}), 200 # 管理员用户接口 @app.route('/admin', methods=['GET']) @jwt_required def admin(): user_id = get_jwt_identity() if not get_raw_jwt()['is_admin']: return jsonify({'msg': 'You are not authorized to access this resource'}), 403 return jsonify({'msg': f'Hello admin {user_id}!'}), 200 在这个例子中,我们使用了 flask_jwt_extended 扩展来生成 JWT token,并在登录时将用户的 is_admin 属性作为 user_claims 传递给了 create_access_token() 函数。在普通用户接口和管理员用户接口中,我们使用了 @jwt_required 装饰器来保护接口,同时使用 get_jwt_identity() 函数获取用户的 id,使用 get_raw_jwt() 函数获取用户的 user_claims,从而判断用户是否为管理员。
好的,以下是一个使用 flask_jwt_extended 和 token_in_blocklist_loader 的例子: python from flask import Flask 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 黑名单 blocklist = set() # 定义 token_in_blocklist_loader 回调函数 @jwt.token_in_blocklist_loader def check_if_token_in_blocklist(jwt_header, jwt_payload): jti = jwt_payload['jti'] return jti in blocklist # 定义登录接口 @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": "Bad username or password"}), 401 access_token = create_access_token(identity=username) return jsonify(access_token=access_token), 200 # 定义需要 token 认证的接口 @app.route('/protected', methods=['GET']) @jwt_required def protected(): current_user = get_jwt_identity() return jsonify(logged_in_as=current_user), 200 # 定义注销接口 @app.route('/logout', methods=['DELETE']) @jwt_required def logout(): jti = get_raw_jwt()['jti'] blocklist.add(jti) return jsonify({"msg": "Successfully logged out"}), 200 if __name__ == '__main__': app.run() 这个例子中,我们定义了一个 token 黑名单 blocklist,并在 token_in_blocklist_loader 回调函数中检查 token 是否在黑名单中。当用户注销时,我们将该 token 的 jti 添加到黑名单中。这样,即使该 token 没有过期,也无法再次使用。

最新推荐

SpringBoot+Vue的学生管理信息系统附加源码.rar

SpringBoot+Vue的学生管理信息系统附加源码.rar

客户信用等级分析表.xlsx

客户信用等级分析表.xlsx

MATLAB遗传算法工具箱在函数优化中的应用.pptx

MATLAB遗传算法工具箱在函数优化中的应用.pptx

网格QCD优化和分布式内存的多主题表示

网格QCD优化和分布式内存的多主题表示引用此版本:迈克尔·克鲁斯。网格QCD优化和分布式内存的多主题表示。计算机与社会[cs.CY]南巴黎大学-巴黎第十一大学,2014年。英语。NNT:2014PA112198。电话:01078440HAL ID:电话:01078440https://hal.inria.fr/tel-01078440提交日期:2014年HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaireU大学巴黎-南部ECOLE DOCTORALE d'INFORMATIQUEDEPARIS- SUDINRIASAACALLE-DE-FRANCE/L ABORATOIrEDERECHERCH EEE NINFORMATIqueD.坐骨神经痛:我的格式是T是博士学位2014年9月26日由迈克尔·克鲁斯网格QCD优化和分布式内存的论文主任:克里斯汀·艾森贝斯研究主任(INRIA,LRI,巴黎第十一大学)评审团组成:报告员:M. 菲利普�

gru预测模型python

以下是一个使用GRU模型进行时间序列预测的Python代码示例: ```python import torch import torch.nn as nn import numpy as np import pandas as pd import matplotlib.pyplot as plt # 加载数据 data = pd.read_csv('data.csv', header=None) data = data.values.astype('float32') # 划分训练集和测试集 train_size = int(len(data) * 0.7) train_data = d

vmware12安装配置虚拟机

如何配置vmware12的“首选项”,"虚拟网络编辑器","端口映射”,"让虚拟机连接到外网”

松散事务级模型的并行标准兼容SystemC仿真

松散事务级模型的并行标准兼容SystemC仿真

AttributeError: 'MysqlUtil' object has no attribute 'db'

根据提供的引用内容,错误信息应该是'MysqlUtil'对象没有'db'属性,而不是'MysqlUtil'对象没有'connect'属性。这个错误信息通常是由于在代码中使用了'MysqlUtil'对象的'db'属性,但是该属性并不存在。可能的原因是'MysqlUtil'对象没有被正确地初始化或者没有正确地设置'db'属性。建议检查代码中是否正确地初始化了'MysqlUtil'对象,并且是否正确地设置了'db'属性。

数字化转型对企业业绩的影响研究以海尔智家为例.pptx

数字化转型对企业业绩的影响研究以海尔智家为例.pptx

泰瑞克·萨亚关联数据中的选择性披露和推理泄漏问题的研究

泰瑞克·萨亚关联数据中的选择性披露和推理泄漏问题的研究