Flask-JWT-Extended登录验证, 不用自定义
"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt = JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外,你还可以指定其他的选项,例如:过期时间 (max_age): 指定 cookie 何时过期。# max_age=60 * 60 * 24 * 7 # 7天有效期max_age=datetime.timedelta(days=2)1. 设置cookies# 设置cookies成功 重定向到首页# 创建JWT token,只存储用户名access_token = create_access_token(identity=username)# 设置JWT到cookie并重定向到主页response = redirect(url_for('index'))set_access_cookies(response, access_token,# max_age=60 * 60 * 24 * 7 # 7天有效期max_age=datetime.timedelta(days=2))return response1.1 # 创建JWT token,只存储用户名# 访问令牌 fresh=True 创建新鲜令牌access_token = create_access_token(identity=username, fresh=True) # fresh=True 创建新鲜令牌# 刷新令牌refresh_token = create_refresh_token(identity=username)# 设置JWT到cookie并重定向到主页response = redirect(url_for('index'))set_access_cookies(response, access_token,# max_age=60 * 60 * 24 * 7 # 7天有效期# max_age=datetime.timedelta(days=2))# 设置刷新令牌set_refresh_cookies(response, refresh_token,# max_age=60 * 60 * 24 * 7 # 7天有效期# max_age=datetime.timedelta(days=2))return response2. 获取cookies# 获取当前会话中的身份信息info = get_jwt_identity()return render_template('index.html', info=info)3. 设置cookies会话有效期# 设置JWT到cookie并重定向到主页response = redirect(url_for('index'))set_access_cookies(response, access_token,# max_age=60 * 60 * 24 * 7 # 7天有效期# max_age=datetime.timedelta(days=2))# 设置刷新令牌set_refresh_cookies(response, refresh_token,# max_age=60 * 60 * 24 * 7 # 7天有效期# max_age=datetime.timedelta(days=2))4. 删除cookies# 注销用户并删除JWT cookiesresponse = redirect(url_for('login'))# unset_access_cookies(response) # 清除访问令牌# unset_refresh_cookies(response) # 清除刷新令牌unset_jwt_cookies(response) # 可以清除访问+刷新令牌return response5. response创建对象的方法:导包:from flask import make_response, Response# 1. response = make_response(redirect(url_for('test_blue.login_index')))# 2. response = make_response(render_template('test/home.html'), 200)# 3. response = make_response("success", 201)# 这种就可以# 4. response = redirect(url_for('login'))6. 捕获异常 并重定向# 捕获令牌过期@jwt.expired_token_loaderdef expired_token_callback(jwt_header, jwt_payload):return redirect(url_for('login', message="Session expired, please log in again."))# 捕获无效的令牌@jwt.invalid_token_loaderdef invalid_token_callback(error):return redirect(url_for('login', message="Invalid token, please log in again."))# 捕获缺少令牌的情况@jwt.unauthorized_loaderdef missing_token_callback(error):return redirect(url_for('login', message="Token missing, please log in."))# 捕获刷新令牌失效@jwt.revoked_token_loaderdef revoked_token_callback(jwt_header, jwt_payload):return redirect(url_for('login', message="Token revoked, please log in again."))"""
'''# 1. 两者不能同时使用 fresh=True:用于要求新鲜令牌来访问敏感操作。 refresh=True:用于要求刷新令牌来生成新的访问令牌。# 2. 使用新鲜令牌 在创建 (访问令牌)access_token 时 设置 fresh=True access_token = create_access_token(identity=username, fresh=True) # fresh=True 创建新鲜令牌# 3. 在装饰里 设置 fresh=True 才能验证新鲜令牌 @jwt_required(fresh=True)'''
import datetime
import hashlibfrom flask import (Flask, render_template, redirect, url_for, request,make_response, Response, current_app
)
from functools import wraps
from flask_jwt_extended import (JWTManager,jwt_required,verify_jwt_in_request,create_access_token,create_refresh_token,get_jwt_identity,get_current_user,set_access_cookies,set_refresh_cookies,unset_refresh_cookies, # 刷新令牌unset_access_cookies, # 访问令牌unset_jwt_cookies, # 同时清除 访问令牌 和 刷新令牌)app = Flask(__name__)
app.secret_key = "ghakjhkghkahkhgkhalkfdngkasnkglhaj".encode('utf-8')app.config['JWT_TOKEN_LOCATION'] = ["cookies"]jwt = JWTManager(app) # 初始化JWTManager# 捕获令牌过期
@jwt.expired_token_loader
def expired_token_callback(jwt_header, jwt_payload):return redirect(url_for('login', message="Session expired, please log in again."))# 捕获无效的令牌
@jwt.invalid_token_loader
def invalid_token_callback(error):return redirect(url_for('login', message="Invalid token, please log in again."))# 捕获缺少令牌的情况
@jwt.unauthorized_loader
def missing_token_callback(error):return redirect(url_for('login', message="Token missing, please log in."))# 捕获刷新令牌失效
@jwt.revoked_token_loader
def revoked_token_callback(jwt_header, jwt_payload):return redirect(url_for('login', message="Token revoked, please log in again."))@app.route('/')
@app.route('/index', methods=["GET", "POST"])
@jwt_required(fresh=True)
def index():# 获取当前会话中的身份信息info = get_jwt_identity()return render_template('index.html', info=info)@app.route('/login', methods=["GET", "POST"])
def login():if request.method == "POST":username = request.form.get('username', None)password = request.form.get('password', None)confirm_password = request.form.get('confirm_password', None)# 表单验证逻辑if not username or not password or not confirm_password:return render_template('login.html', errors="所有字段不能为空")if password != confirm_password:return render_template('login.html', errors="密码不一致")# 假设用户名和密码验证成功if username == "root" and password == "123":# 创建JWT token,只存储用户名access_token = create_access_token(identity=username, fresh=True) # fresh=True 创建新鲜令牌refresh_token = create_refresh_token(identity=username)# 设置JWT到cookie并重定向到主页response = redirect(url_for('index'))set_access_cookies(response, access_token,# max_age=60 * 60 * 24 * 7 # 7天有效期# max_age=datetime.timedelta(days=2))# 设置刷新令牌set_refresh_cookies(response, refresh_token,# max_age=60 * 60 * 24 * 7 # 7天有效期# max_age=datetime.timedelta(days=2))return responseelse:return render_template('login.html', errors="账号或密码有误")return render_template('login.html')@app.route('/logout', methods=["GET", "POST"])
@jwt_required(fresh=True)
def logout():# 注销用户并删除JWT cookiesresponse = redirect(url_for('login'))# unset_access_cookies(response) # 清除访问令牌# unset_refresh_cookies(response) # 清除刷新令牌unset_jwt_cookies(response) # 可以清除访问+刷新令牌return response# 刷新访问令牌,需要刷新令牌
@app.route('/refresh', methods=['GET', 'POST'])
@jwt_required(refresh=True) # 使用刷新令牌进行验证
def refresh():current_user = get_jwt_identity() # 从刷新令牌中获取用户身份new_access_token = create_access_token(identity=current_user, fresh=True) # 生成新的访问令牌refresh_token = create_refresh_token(identity=current_user) # 生成新的刷新令牌# 创建响应并设置新的访问令牌到 cookiesresponse = redirect(url_for('index')) # 重定向到主页set_access_cookies(response, new_access_token) # 将新的访问令牌写入 cookiesset_refresh_cookies(response, refresh_token) # 将新的刷新令牌写入 cookiesreturn response@app.route('/test')
@jwt_required(fresh=True)
def test():return "测试成功"if __name__ == '__main__':app.run(debug=True)
相关文章:

Flask-JWT-Extended登录验证, 不用自定义
"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外,你还可以指定其他的选项,例如:过期时间 (max_age)࿱…...
rpm 与 yum
11 rpm -qa | grep openssh rpm与 yum CentOS仅删除软件包本身而不删除依赖 https://blog.csdn.net/kangshuaibi/article/details/125472204...
几种修改docker默认存储位置的方法
需求 docker容器存放目录磁盘空间满了,需要转移数据,修改Docker默认存储位置 解决方法 方法1:迁移到新目录 停止docker服务。 1systemctl stop docker; //每个liunx版本的命令不一样。创建新的docker目录,执行命令df…...

istio中如何使用serviceentry引入外部服务
假设需要引入一个外部服务,外部服务ip为10.10.102.90,端口为32033. 引入到istio中后,我想通过域名gindemo.test.ch:9090来访问这个服务。 serviceentry yaml内容如下: apiVersion: networking.istio.io/v1beta1 kind: ServiceEn…...

模仿抖音用户ID加密ID的算法MB4E,提高自己平台ID安全性
先看抖音的格式 对ID加密的格式 MB4EENgLILJPeQKhJht-rjcc6y0ECMk_RGTceg6JBAA 需求是 同一个ID 比如 413884936367560 每次获取得到的加密ID都是不同的,最终解密的ID都是413884936367560 注意这是一个加密后可解密原文的方式,不是单向加密 那么如下进行…...

solidwork镜像实体
效果如下: 可以看到这两条线是对称的。 第一步,点击这条要镜像的边,接着点击镜像实体。 然后选择镜像轴,即可...

第6天:趋势轮动策略开发(年化18.8%,大小盘轮动加择时)
原创内容第655篇,专注量化投资、个人成长与财富自由。 轮动策略是一种投资策略,它涉及在不同的资产类别、行业或市场之间进行切换,以捕捉市场机会并优化投资组合的表现。 这种策略的核心在于识别并利用不同资产或市场的相对强弱,…...

米客方德SD NAND 掉电测试
SD NAND 异常上下电测试的作用 SD NAND 异常上下电测试是一项关键的测试步骤,对确保SD NAND在不同电源条件下的稳定性和可靠性至关重要。 通过模拟正常和异常电源情况,测试可以验证设备的电源管理功能、检测潜在错误和异常行为,并评估设备在…...

深入探索Android开发之Kotlin核心技术学习大全
Android作为全球最流行的移动操作系统之一,其开发技能的需求日益增长。本文将为您介绍一套专为Android开发者设计的Kotlin核心技术学习资料,包括详细的学习大纲、PDF文档、源代码以及配套视频教程,帮助您从Kotlin基础到高级特性,再…...
langchain报错记录(js)
文章目录 [ERR_PACKAGE_PATH_NOT_EXPORTED]报错:报错语句:思路:解决方法: [ERR_PACKAGE_PATH_NOT_EXPORTED] 报错: Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: Package subpath ‘./dist/prompts/’ is not defined by…...

VSCode调试Unity准备工作
一.Unity设置VSCode为默认编辑器 Unity编辑器中Edit-Preferences-External Tools中选择VSCode 二.VSCode安装Unity插件 三.Unity的Visual Studio Editor升至最新 Window->Package Manager->Visual Studio Editor 四.下载配置.Net 8.0 安装之前VSCode会提示你下载.Net …...

缓存穿透 问题(缓存空对象)
文章目录 1、缓存穿透2、缓存空对象3、AlbumInfoApiController --》getAlbumInfo()4、AlbumInfoServiceImpl --》getAlbumInfo()5、RedisConstant6、请求缓存不存在的数据 1、缓存穿透 2、缓存空对象 3、AlbumInfoApiController --》getAlbumInfo() GetMapping("getAlbumI…...

Vue3:mitt实现组件通信
目录 一.性质 1.轻量级 2.单例 3.异步 4.事件绑定与解绑 二.作用 1.组件间通信 2.解耦 3.状态管理 4.事件的集中处理 三.使用 1.安装mitt 2.引入mitt;调用mitt;暴露mitt 3.组件1 4.组件2 四.代码 1.组件1 2.组件2 五.效果 一.性质 1…...
一个有个性的使用工具thefuck@Ubuntu
这个工具名字可能有些粗鄙,不过真的有让人眼前一亮的功能。 当用户输入错误的命令时,TheFuck会根据上下文自动推测并给出正确的命令建议。 安装 apt update apt search thefuck apt install thefuck 使用 在错误命令下面直接输入thefuck即可。 不过…...
【PyQt5】PyQt5桌面APP开发学习
跟我学习PyQt5之每天一更 1、兴趣是最好的坚持2、object基类3、QWidget子类 等我不更新了,就说明我学习完成了,有想学而又不会的可以催更留言! 1、兴趣是最好的坚持 看视频看书不如先来一个游戏玩一玩,学习由对他有兴趣开始 2024…...

JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
JdbcTemplate是Spring框架中的一个重要组件,主要用于简化JDBC数据库操作。它提供了许多常用的方法,如查询、插入、更新、删除等。本文将介绍JdbcTemplate的常用方法及其使用方式,以及参数绑定和删除数据的方法。 一、JdbcTemplate常用方法 查…...

向日葵好用吗?4款稳定的远程控制软件推荐。
远程控制技术现在已经被应用于很多个领域,像企业办公,远程协助,智能家居,工业控制等等。我们常常会用到的时前两种。而实现远程控制的方式也有多种,但是最方便高效的还是使用第三方软件。我最常使用的是向日葵…...

【开源大模型生态9】百度的文心大模型
这张图展示了百度千帆大模型平台的功能架构及其与BML-AI开发平台和百度百舸AI异构计算平台的关系。以下是各个模块的解释: 模型广场: 通用大模型:提供基础的自然语言处理能力。行业大模型:针对不同行业的定制化模型。大模型工具链…...

CSS的三种基本选择器
使用CSS控制网页格式有行内法,内嵌式,链接式,导入式等方法 这里将采用内嵌式的方法书写 内嵌法就是通过<style>标记将样式定义在HTML的文件头部中 1.标记选择器 标记选择器特点:定义了标记选择器之后,网页中…...

排序学习笔记
目录 排序排序的相关概念冒泡排序插入排序选择排序堆排序快速排序归并排序 内排序和外排序非比较排序稳定性稳定性 完 排序 排序的相关概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...