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.标记选择器 标记选择器特点:定义了标记选择器之后,网页中…...

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

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...