FastAPI 中 JWT 的基本使用与实践
1. 引言JWTJSON Web Token是目前最流行的无状态认证方案之一。在 FastAPI 中结合python-jose与passlib可以快速实现基于 JWT 的用户认证与授权。本文将从零开始带你掌握 FastAPI 中 JWT 的基本使用与实践。2. 环境准备首先安装所需依赖pipinstallfastapi uvicorn python-jose[cryptography]passlib[bcrypt]python-multipart各依赖的作用如下fastapiWeb 框架。uvicornASGI 服务器用于运行应用。python-jose负责 JWT 的生成与校验。passlib用于密码哈希配合bcrypt算法。python-multipart处理 OAuth2 表单登录请求。3. JWT 核心概念JWT 由三部分组成用点号分隔header.payload.signatureHeader声明令牌类型与签名算法。Payload存放用户信息与过期时间等声明。Signature由 Header、Payload 与密钥共同签名生成用于防篡改。JWT 是无状态的服务端无需保存会话信息令牌本身携带了用户身份适合分布式与前后端分离场景。4. 项目结构我们采用清晰的分层结构project/ ├── main.py # 应用入口 ├── auth.py # JWT 与密码工具 ├── schemas.py # Pydantic 模型 └── requirements.txt # 依赖清单5. 编写认证工具模块创建auth.py封装密码哈希与 JWT 生成、校验逻辑fromdatetimeimportdatetime,timedeltafromtypingimportOptionalfromjoseimportJWTError,jwtfrompasslib.contextimportCryptContext# 密钥与算法配置生产环境务必使用环境变量保存密钥SECRET_KEYyour-secret-key-change-meALGORITHMHS256ACCESS_TOKEN_EXPIRE_MINUTES30pwd_contextCryptContext(schemes[bcrypt],deprecatedauto)defverify_password(plain_password:str,hashed_password:str)-bool:校验明文密码与哈希是否匹配returnpwd_context.verify(plain_password,hashed_password)defget_password_hash(password:str)-str:生成密码哈希returnpwd_context.hash(password)defcreate_access_token(data:dict,expires_delta:Optional[timedelta]None)-str:生成 JWT 访问令牌to_encodedata.copy()expiredatetime.utcnow()(expires_deltaortimedelta(minutesACCESS_TOKEN_EXPIRE_MINUTES))to_encode.update({exp:expire})returnjwt.encode(to_encode,SECRET_KEY,algorithmALGORITHM)defdecode_token(token:str)-Optional[dict]:解析并校验 JWT失败返回 Nonetry:returnjwt.decode(token,SECRET_KEY,algorithms[ALGORITHM])exceptJWTError:returnNone6. 定义 Pydantic 模型创建schemas.pyfrompydanticimportBaseModelclassToken(BaseModel):登录成功返回的令牌access_token:strtoken_type:strbearerclassUserCreate(BaseModel):注册请求体username:strpassword:strclassUserOut(BaseModel):用户信息响应体username:str7. 编写主应用创建main.py实现注册、登录与受保护接口fromtypingimportOptionalfromfastapiimportDepends,FastAPI,HTTPException,statusfromfastapi.securityimportOAuth2PasswordBearer,OAuth2PasswordRequestFormfromauthimportcreate_access_token,decode_token,get_password_hash,verify_passwordfromschemasimportToken,UserCreate,UserOut appFastAPI(titleJWT 实践示例)# 模拟用户存储生产环境请使用数据库fake_users_db{}# OAuth2 密码模式从 Authorization 头提取 Bearer Tokenoauth2_schemeOAuth2PasswordBearer(tokenUrl/login)app.post(/register,response_modelUserOut)defregister(user:UserCreate):用户注册ifuser.usernameinfake_users_db:raiseHTTPException(status_code400,detail用户名已存在)fake_users_db[user.username]get_password_hash(user.password)returnUserOut(usernameuser.username)app.post(/login,response_modelToken)deflogin(form_data:OAuth2PasswordRequestFormDepends()):用户登录返回 JWThashedfake_users_db.get(form_data.username)ifnothashedornotverify_password(form_data.password,hashed):raiseHTTPException(status_codestatus.HTTP_401_UNAUTHORIZED,detail用户名或密码错误,headers{WWW-Authenticate:Bearer},)tokencreate_access_token({sub:form_data.username})returnToken(access_tokentoken)app.get(/users/me,response_modelUserOut)defread_current_user(token:strDepends(oauth2_scheme)):受保护接口解析令牌并返回当前用户payloaddecode_token(token)ifpayloadisNoneorpayload.get(sub)isNone:raiseHTTPException(status_codestatus.HTTP_401_UNAUTHORIZED,detail无效或过期的令牌,headers{WWW-Authenticate:Bearer},)usernamepayload[sub]ifusernamenotinfake_users_db:raiseHTTPException(status_code404,detail用户不存在)returnUserOut(usernameusername)8. 运行与测试启动服务uvicorn main:app--reload8.1 注册用户curl-XPOST http://127.0.0.1:8000/register\-HContent-Type: application/json\-d{username: alice, password: secret123}8.2 登录获取令牌curl-XPOST http://127.0.0.1:8000/login\-HContent-Type: application/x-www-form-urlencoded\-dusernamealicepasswordsecret123返回示例{access_token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...,token_type:bearer}8.3 访问受保护接口curlhttp://127.0.0.1:8000/users/me\-HAuthorization: Bearer 你的access_token9. 完整流程图失败成功无效/过期有效客户端发起登录POST /login校验用户名密码返回 401生成 JWT返回 access_token客户端携带 Token 请求受保护接口服务端解析并校验 JWT令牌有效?返回 401返回用户数据10. 实践建议与安全注意事项密钥管理SECRET_KEY务必通过环境变量或密钥管理服务注入切勿硬编码在代码中。过期时间根据业务设置合理的exp敏感操作可配合刷新令牌Refresh Token机制。密码存储使用bcrypt等强哈希算法切勿明文存储。HTTPS生产环境必须启用 HTTPS防止令牌在传输中被窃取。权限控制可在 Payload 中加入role字段结合依赖注入实现基于角色的访问控制RBAC。11. 总结本文从环境搭建、核心概念到完整代码带你走通了 FastAPI 中 JWT 的基本使用与实践。通过python-jose生成与校验令牌、passlib管理密码哈希再配合 FastAPI 的OAuth2PasswordBearer依赖注入即可快速构建安全可靠的无状态认证体系。后续可在此基础上扩展刷新令牌、角色权限与数据库持久化打造更完善的生产级认证方案。

相关新闻

从半加器到超前进位:加法器设计原理与Verilog实现

从半加器到超前进位:加法器设计原理与Verilog实现

1. 从半加器到全加器:为什么需要两级结构 很多人学数字电路,学到加法器这一节就开始犯迷糊。教材上先讲半加器,再讲全加器,然后告诉你全加器可以由两个半加器加一个或门拼出来。但为什么要这么拼?直接用一个电路把三个…

2026/10/15 17:35:54 阅读更多 →
SamsaraJS 完全入门指南:快速构建硬件加速的连续动画用户界面

SamsaraJS 完全入门指南:快速构建硬件加速的连续动画用户界面

前端UI库/组件 【免费下载链接】samsara Continuous UI 项目地址: https://gitcode.com/gh_mirrors/sa/samsara 点击查看 免费下载 SamsaraJS 是一个专注于「连续 UI(Continuous UI)」的 JavaScript 动画库:它让页面上的多个视觉…

2026/10/15 17:35:54 阅读更多 →
oh-my-bash absimple 主题详解:基于 agnoster 的精简分段式 Bash 提示符

oh-my-bash absimple 主题详解:基于 agnoster 的精简分段式 Bash 提示符

开发工具CLI 【免费下载链接】oh-my-bash A delightful community-driven framework for managing your bash configuration, and an auto-update tool so that makes it easy to keep up with the latest updates from the community. 项目地址: https://gitcode.c…

2026/10/15 17:35:54 阅读更多 →

最新新闻

Java实现微信企业付款到零钱(v3接口)实战指南

Java实现微信企业付款到零钱(v3接口)实战指南

简介:本资源是一份面向Java后端开发者的企业级微信支付实战代码包,聚焦微信企业付款到零钱核心功能,适用于工资发放、奖金结算、退款处理等真实业务场景。资源共2个Java源文件,总大小仅3KB,轻量精炼:其中Wx…

2026/10/15 18:29:44 阅读更多 →
CEF拦截WSS全攻略:在握手前阻断WebSocket Secure连接

CEF拦截WSS全攻略:在握手前阻断WebSocket Secure连接

简介:面向.NET开发者的一套CEFSharp完整拦截方案代码,目标是让应用程序接管浏览器内全部WSS与WebSocket通信,适合需要调试实时数据、实施安全审计或做自定义过滤的中高级开发人员。资源以WinForm项目为载体,覆盖从注册自定义Schem…

2026/10/15 18:29:44 阅读更多 →
Nessus授权扫描实战:从部署策略到报告解读的完整指南

Nessus授权扫描实战:从部署策略到报告解读的完整指南

搞安全这行,漏洞扫描是绕不开的日常。不管你是企业安全团队的在编人员,还是乙方评估机构的外派工程师,刚接触安全评估的工具清单里,Nessus几乎都是第一个跳出来的名字——插件库更新快,上手门槛低,报告的误…

2026/10/15 18:29:44 阅读更多 →
轻量级txt转XML工具:工业场景下的结构化数据转换实践

轻量级txt转XML工具:工业场景下的结构化数据转换实践

简介:这是一款面向编程初学者与数据处理开发者的轻量级TXT转XML格式转换工具,解决非结构化文本数据难以直接用于系统集成、配置管理或API交互的痛点,适用于教学实践、小规模数据迁移及XML入门学习场景。资源包共37个文件,以12个C#…

2026/10/15 18:29:44 阅读更多 →
Flutter for OpenHarmony状态管理实战:从选型到跨端同步排坑

Flutter for OpenHarmony状态管理实战:从选型到跨端同步排坑

在 Flutter 跨平台这件事上,Android、iOS 甚至 Windows 都已经是老生常谈了,但如果是把 Flutter 跑在 OpenHarmony 上呢?这事的关注度这几年一直在涨。尤其当你手里正好有一台搭载 OpenHarmony 的设备,又不想为了这套系统单独维护…

2026/10/15 18:29:44 阅读更多 →
如何安全取消 wreq 请求?深入 HTTP/1、HTTP/2、HTTP/3 的 Cancel Safety 完整指南

如何安全取消 wreq 请求?深入 HTTP/1、HTTP/2、HTTP/3 的 Cancel Safety 完整指南

【免费下载链接】wreq An ergonomic, privacy-aware Rust HTTP Client 项目地址: https://gitcode.com/gh_mirrors/rq/wreq 点击查看 免费下载 wreq 是一个注重易用性与隐私的 Rust 异步 HTTP 客户端。在 wreq 中取消请求的方式非常统一:丢弃&#xff0…

2026/10/15 18:28:43 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →