Flask怎么使用JWT生成和验证Token

风杰酱_2971

风杰酱_2971

2026-09-26

675人浏览

原创

PyJWT手动生成验证token最简路径是显式指定algorithm、设置exp并校验签名;需用装饰器封装jwt.decode,捕获所有异常,且SECRET_KEY必须一致。

flask怎么使用jwt生成和验证token

Flask 中用 PyJWT 手动生成和验证 token 最简路径

不用扩展也能做,PyJWT 本身足够轻量。关键不是“能不能”,而是“别漏掉 exp 和 verify_signature”。很多人本地测试能过,一上生产就报 InvalidTokenError 或静默失败,基本都是签名密钥没对齐、时间戳未校验、或算法写错。

安装后直接用:

pip install PyJWT

生成 token 示例(含必要字段):

import jwt
import datetime
<p>SECRET_KEY = "your-secret-key"  # 生产环境务必从环境变量读取
payload = {
"user_id": 123,
"username": "alice",
"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1)
}
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
</p>
  • algorithm 必须显式指定,PyJWT >= 2.0 已移除默认算法,不写会报 TypeError: encode() missing 1 required positional argument: 'algorithm'
  • exp 强烈建议加上,否则 token 永不过期;验证时需主动传 options={"verify_exp": True},否则不会检查
  • SECRET_KEY 在 Flask 多进程或重启后必须保持一致,否则旧 token 全部失效

Flask 路由里验证 token 的典型写法

别在每个视图里重复写 jwt.decode,封装成装饰器最稳。重点是捕获所有可能异常,而不是只 catch InvalidTokenError。

from functools import wraps
from flask import request, jsonify
<p>def require_jwt(f):
@wraps(f)
def decorated(*args, **kwargs):
auth_header = request.headers.get("Authorization")
if not auth_header or not auth_header.startswith("Bearer "):
return jsonify({"error": "Missing or invalid Authorization header"}), 401</p><pre class="brush:php;toolbar:false;">    token = auth_header[7:]  # 去掉 "Bearer " 前缀
    try:
        payload = jwt.decode(
            token,
            SECRET_KEY,
            algorithms=["HS256"],
            options={"verify_exp": True}  # 显式启用过期检查
        )
    except jwt.ExpiredSignatureError:
        return jsonify({"error": "Token expired"}), 401
    except jwt.InvalidTokenError:
        return jsonify({"error": "Invalid token"}), 401
    except Exception:
        return jsonify({"error": "Token decode failed"}), 401

    request.current_user = payload  # 注入到 request 上下文
    return f(*args, **kwargs)
return decorated

NERRA Token Strategist
NERRA Token Strategist

生成专为Bags.fm发行和Degen文化定制的Meme优化Solana代币概念、 launch策略及病毒式Twitter推文。

下载
  • HTTP Header 必须是 Authorization: Bearer <token></token>,前端漏空格或大小写错误(如 bearer)都会导致解析失败
  • algorithms 参数必须是列表(["HS256"]),传字符串会报 TypeError: expected list
  • 不要把 payload 直接当用户对象用——里面字段没做服务端校验,比如 user_id 是否真实存在,得查库确认

为什么不用 Flask-JWT-Extended?

它确实省事,但隐含行为多:自动刷新逻辑、固定 cookie 名、强制使用 current_user 全局变量。如果你只需要登录后发一个短期 token 给前端存 localStorage,再带过来校验,那 PyJWT + 手写装饰器更透明、更容易调试。

容易踩的坑:

  • Flask-JWT-Extended 默认用 datetime.utcnow() 校验 exp,但如果你的服务器时区不是 UTC,且没配 JWT_ACCESS_TOKEN_EXPIRES 为 timedelta,token 会提前失效
  • 它的 @jwt_required() 不校验 fresh 字段,除非你显式加 @jwt_required(fresh=True),而这个字段需要额外调 create_fresh_token
  • 升级到 v4+ 后,get_jwt_identity() 返回的是解码后的整个 payload,不是原先的 user_id —— 如果代码里直接 int(get_jwt_identity()) 就会崩

调试 token 时最该看的三件事

token 看似一串乱码,其实可分三段 Base64Url 解码(用在线工具或 jwt.decode(token, options={"verify_signature": False}))。真正出问题时,先盯住:

  • Header 段里的 alg 值是不是 HS256(别是 none 或空)
  • Payload 段里的 exp 是不是 Unix 时间戳,且比当前时间大(注意时区!)
  • 签名段是否被篡改 —— 改任意字符都会让 jwt.decode 报 InvalidSignatureError,不是 InvalidTokenError

签名密钥哪怕多一个空格、换行符,或者用了 bytes 而不是 str,验证都会失败,且错误信息几乎一样,只能靠打印 repr(SECRET_KEY) 排查。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
flask框架如何搭建
flask框架如何搭建

搭建步骤:1、安装Python和Pip;2、创建虚拟环境;3、安装Flask;4、创建Flask应用;5、运行应用;6、访问应用。想了解更多flask框架的相关内容,可以阅读本专题下面的文章。

2024.06.27

2995

8

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

2025.08.25

4464

10

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

2025.12.15

276

16

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

80

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

40

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

20

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

20

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

40

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

40

19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Flask-Migrate数据库迁移文档
Flask-Migrate数据库迁移文档

共0课时 | 0人学习

Flask官方快速入门文档
Flask官方快速入门文档

共0课时 | 0人学习