FastAPI 实战:从零实现一个可执行的 JWT 登录认证接口
一、前言在 Web 后端开发中登录认证几乎是每个项目都会遇到的基础功能。传统 Session 方案需要服务端保存用户状态而 JWT 更适合前后端分离项目。本文将使用 FastAPI 实现一个完整、可执行的 JWT 登录认证流程包括安装依赖编写登录接口生成 JWT Token校验 JWT Token获取当前登录用户访问需要登录才能使用的接口本文示例代码可以直接复制运行。二、JWT 是什么JWT全称 JSON Web Token是一种用于在客户端和服务端之间安全传递身份信息的 Token 格式。一个 JWT 通常由三部分组成Header.Payload.Signature其中Header声明 Token 类型和签名算法Payload保存用户相关信息例如用户 ID、用户名、过期时间Signature签名用于防止 Token 被篡改用户登录成功后服务端会生成 JWT 并返回给客户端。客户端后续请求接口时在请求头中携带这个 Token服务端验证通过后即可识别当前用户身份。三、准备环境本文示例环境Python 3.10 FastAPI Uvicorn python-jose passlib安装依赖python -m pip install fastapi uvicorn python-jose passlib[bcrypt] python-multipart说明fastapi Web 框架 uvicorn ASGI 服务 python-jose 生成和解析 JWT passlib[bcrypt] 密码加密与校验 python-multipart 支持表单登录项目结构fastapi-jwt-demo/ └── main.py四、完整代码创建main.py文件写入以下代码from datetime import datetime, timedelta from fastapi import FastAPI, Depends, HTTPException, status from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm from jose import JWTError, jwt from passlib.context import CryptContext from pydantic import BaseModel app FastAPI() SECRET_KEY change-this-secret-key ALGORITHM HS256 ACCESS_TOKEN_EXPIRE_MINUTES 30 pwd_context CryptContext(schemes[bcrypt], deprecatedauto) oauth2_scheme OAuth2PasswordBearer(tokenUrl/login) fake_users_db { admin: { username: admin, hashed_password: pwd_context.hash(123456), disabled: False, } } class TokenResponse(BaseModel): access_token: str token_type: str class UserInfo(BaseModel): username: str disabled: bool False def verify_password(plain_password: str, hashed_password: str) - bool: return pwd_context.verify(plain_password, hashed_password) def authenticate_user(username: str, password: str): user fake_users_db.get(username) if not user: return None if not verify_password(password, user[hashed_password]): return None return UserInfo(usernameuser[username], disableduser[disabled]) def create_access_token(data: dict, expires_delta: timedelta): to_encode data.copy() expire datetime.utcnow() expires_delta to_encode.update({exp: expire}) encoded_jwt jwt.encode( to_encode, SECRET_KEY, algorithmALGORITHM, ) return encoded_jwt async def get_current_user(token: str Depends(oauth2_scheme)): credentials_exception HTTPException( status_codestatus.HTTP_401_UNAUTHORIZED, detailToken 无效或已过期, headers{WWW-Authenticate: Bearer}, ) try: payload jwt.decode( token, SECRET_KEY, algorithms[ALGORITHM], ) username payload.get(sub) if username is None: raise credentials_exception except JWTError: raise credentials_exception user fake_users_db.get(username) if user is None: raise credentials_exception return UserInfo(usernameuser[username], disableduser[disabled]) app.post(/login, response_modelTokenResponse) def login(form_data: OAuth2PasswordRequestForm Depends()): user authenticate_user( form_data.username, form_data.password, ) if not user: raise HTTPException( status_codestatus.HTTP_401_UNAUTHORIZED, detail用户名或密码错误, headers{WWW-Authenticate: Bearer}, ) access_token create_access_token( data{sub: user.username}, expires_deltatimedelta(minutesACCESS_TOKEN_EXPIRE_MINUTES), ) return { access_token: access_token, token_type: bearer, } app.get(/me, response_modelUserInfo) def read_current_user(current_user: UserInfo Depends(get_current_user)): return current_user app.get(/protected) def protected_api(current_user: UserInfo Depends(get_current_user)): return { message: 这是一个需要登录后才能访问的接口, user: current_user.username, }五、启动项目在main.py所在目录执行python -m uvicorn main:app --reload启动成功后浏览器访问http://127.0.0.1:8000/docs可以看到 FastAPI 自动生成的 Swagger 接口文档。六、测试账号本文示例内置了一个测试用户用户名admin 密码123456代码中使用hashed_password: pwd_context.hash(123456)运行时会自动生成密码哈希因此可以避免手动复制哈希字符串导致密码校验失败的问题。七、使用 Swagger 测试访问http://127.0.0.1:8000/docs点击右上角Authorize按钮。输入username: admin password: 123456认证成功后再访问GET /me GET /protected即可看到接口正常返回当前用户信息。八、使用命令行测试1. 登录获取 Token如果你使用的是 Windows PowerShell推荐使用curl.execurl.exe -X POST http://127.0.0.1:8000/login ^ -H Content-Type: application/x-www-form-urlencoded ^ -d usernameadminpassword123456如果你使用的是 macOS 或 Linuxcurl -X POST http://127.0.0.1:8000/login \ -H Content-Type: application/x-www-form-urlencoded \ -d usernameadminpassword123456返回结果示例{ access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx, token_type: bearer }2. 访问受保护接口将上一步返回的access_token放到请求头中。Windows PowerShellcurl.exe -X GET http://127.0.0.1:8000/protected ^ -H Authorization: Bearer 你的access_tokenmacOS 或 Linuxcurl -X GET http://127.0.0.1:8000/protected \ -H Authorization: Bearer 你的access_token成功返回示例{ message: 这是一个需要登录后才能访问的接口, user: admin }如果 Token 错误、缺失或过期则会返回 401。九、核心代码解析1. OAuth2PasswordBeareroauth2_scheme OAuth2PasswordBearer(tokenUrl/login)这行代码用于声明当前项目使用 Bearer Token 认证方式。当接口依赖oauth2_scheme时FastAPI 会自动从请求头中读取Authorization: Bearer token值2. 表单登录def login(form_data: OAuth2PasswordRequestForm Depends()):这里使用OAuth2PasswordRequestForm接收登录参数因此登录请求的格式是表单格式而不是 JSON 格式。请求参数为usernameadminpassword123456这种写法可以很好地配合 FastAPI 自带的 Swagger 授权功能。3. 密码校验def verify_password(plain_password: str, hashed_password: str) - bool: return pwd_context.verify(plain_password, hashed_password)项目中不要保存明文密码应保存加密后的密码哈希。本文为了方便演示直接在内存字典中模拟用户数据。4. 生成 JWTdef create_access_token(data: dict, expires_delta: timedelta): to_encode data.copy() expire datetime.utcnow() expires_delta to_encode.update({exp: expire}) encoded_jwt jwt.encode( to_encode, SECRET_KEY, algorithmALGORITHM, ) return encoded_jwt这里将用户身份信息和过期时间写入 JWT。其中sub通常用于保存用户唯一标识例如用户名或用户 ID。5. 校验 JWTpayload jwt.decode( token, SECRET_KEY, algorithms[ALGORITHM], )服务端使用相同的SECRET_KEY解析 Token。如果 Token 被篡改、签名不正确或已经过期解析时会抛出异常然后接口返回 401。6. 保护接口app.get(/protected) def protected_api(current_user: UserInfo Depends(get_current_user)):Depends(get_current_user)表示访问该接口前必须先完成 Token 校验。如果校验失败请求会直接返回 401不会继续执行接口主体。十、常见问题1. 为什么登录接口不是 JSON因为本文使用的是OAuth2PasswordRequestForm它接收的是表单格式数据方便和 FastAPI Swagger 的Authorize功能配合。如果想用 JSON 登录也可以自定义 Pydantic 模型但 Swagger 右上角的授权体验就没有这种方式直接。2. 为什么需要安装 python-multipart因为表单登录需要解析application/x-www-form-urlencoded或multipart/form-data类型的数据。如果没有安装python-multipart启动或请求时可能会出现表单解析相关错误。3. SECRET_KEY 可以随便写吗演示环境可以随便写但生产环境不建议硬编码在代码里。生产环境建议放到环境变量中例如JWT_SECRET_KEY一段足够复杂的随机字符串然后在代码中读取环境变量。4. Token 过期时间怎么设置本文设置为 30 分钟ACCESS_TOKEN_EXPIRE_MINUTES 30实际项目中需要根据业务场景决定。例如后台管理系统可以设置较短时间移动端应用可以结合 Refresh Token 延长登录状态高安全场景应设置更短有效期十一、实际项目优化方向本文示例为了便于理解使用内存字典模拟用户数据。真实项目中通常还需要做以下优化用户数据存储到数据库例如 MySQL、PostgreSQL、MongoDB。SECRET_KEY放到环境变量或配置中心。增加 Refresh Token 机制。增加用户注册接口。增加角色和权限控制。对 Token 加入黑名单机制用于支持主动退出登录。生产环境必须使用 HTTPS避免 Token 泄露。对登录接口增加限流防止暴力破解。统一封装认证异常和返回格式。按业务模块拆分目录结构避免所有代码写在一个文件中。十二、总结本文使用 FastAPI 实现了一个可直接运行的 JWT 登录认证示例完整覆盖了安装依赖、启动服务、登录获取 Token、携带 Token 访问受保护接口等流程。JWT 的优势是简单、无状态、适合前后端分离项目。掌握本文示例后可以继续扩展用户注册、权限控制、Refresh Token、后台管理系统登录等功能。对于 FastAPI 项目来说JWT 认证是非常常见的基础能力。建议在真实项目中结合数据库、环境变量、权限系统和统一异常处理进行进一步封装。

相关新闻

2027北京AI数字健康与智慧医疗展官方:30亿成交额背后

2027北京AI数字健康与智慧医疗展官方:30亿成交额背后

商业成交实效是衡量专业行业展会核心价值最直观的标尺,回顾上一届2026北京AI数字健康与智慧医疗赛逸展运营数据,展会全周期展前预约对接、现场签约洽谈、后期跟进落地的意向合作成交额整体突破30亿元,涵盖医疗设备批量采购、AI诊疗系统院内部…

2026/8/14 3:18:44 阅读更多 →
自带密钥AI可见性成本审计工具:从输入校验到离线报告的完整实现

自带密钥AI可见性成本审计工具:从输入校验到离线报告的完整实现

项目编号:20260813-003。本文代码、测试、文档、示例数据和效果图均为独立编写,不包含热点产品或开源项目源码、品牌素材与官方截图。 问题与目标 按查询、模型、供应商、缓存、失败重试和报告归属核算自带API密钥的可见性监测成本,不接触真…

2026/8/14 3:18:44 阅读更多 →
稳妥可信的中医药新模式 赋能现代健康管理发展

稳妥可信的中医药新模式 赋能现代健康管理发展

一、慢病时代来临,健康管理迎来转型需求当下,居民生活作息、饮食结构的持续变化,让慢性疾病成为影响国民身心健康的主要诱因,国内慢病患病群体规模持续扩大,国民健康需求也随之发生转变。以往以疾病治疗为核心的医疗模…

2026/8/14 3:18:43 阅读更多 →

最新新闻

Query改写技术:从语义理解到精准搜索的核心引擎

Query改写技术:从语义理解到精准搜索的核心引擎

1. 从“搜不到”到“搜得准”:Query改写的价值与挑战你有没有遇到过这种情况?脑子里有一个非常具体的问题,比如“如何让我的Python脚本在后台运行,即使关闭终端窗口也不中断”,但当你把这句话原封不动地敲进搜索引擎时…

2026/8/14 4:20:04 阅读更多 →
从Seq2Seq到注意力机制:深度学习序列建模的核心演进与PyTorch实现

从Seq2Seq到注意力机制:深度学习序列建模的核心演进与PyTorch实现

1. 从“编码-解码”到“注意力”:Seq2Seq模型的演进脉络如果你在2015年前后接触过机器翻译或者聊天机器人,那你大概率听说过Seq2Seq这个名字。它就像一个万能翻译官,能把一串输入序列(比如一句英文)变成另一串输出序列…

2026/8/14 4:20:04 阅读更多 →
OpenCLI:将浏览器网页转化为可编程命令行接口的实践指南

OpenCLI:将浏览器网页转化为可编程命令行接口的实践指南

1. 项目概述:当浏览器窗口变成终端如果你和我一样,每天的工作流里充斥着大量的重复性网页操作——登录某个内部系统查看报表、在项目管理工具里更新任务状态、或者是在电商后台批量上架商品——那你一定对“点击、等待、再点击”的循环感到厌倦。我们这些…

2026/8/14 4:20:04 阅读更多 →
每月一测:2026年8月AI智能体红黑榜,谁涨分了谁翻车了?

每月一测:2026年8月AI智能体红黑榜,谁涨分了谁翻车了?

2026年8月,AI办公智能体赛道经历了一轮密集的“赶考”。阿里8月3日官宣千问办公公测,腾讯同月完成QClaw与WorkBuddy的业务整合,字节则将TRAE SOLO升级为TRAE Work,三家大厂近乎同步完成产品线收拢,集体押注AI办公统一入…

2026/8/14 4:20:04 阅读更多 →
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析

D223的PWM电机控制:6路独立脉冲+加减速算法深度解析

采集卡还能控制电机?D223内置6路独立PWM输出,支持脉冲计数和加减速控制,可以直接驱动步进/伺服电机驱动器。本文从硬件到代码,完整解析PWM电机控制方案。一、硬件基础:达林顿开漏输出 D223的PWM输出采用达林顿开漏输出…

2026/8/14 4:20:04 阅读更多 →
拒绝模板化套路!深度解析龙潭古镇网站建设如何讲好千年故事并实现本地流量变现

拒绝模板化套路!深度解析龙潭古镇网站建设如何讲好千年故事并实现本地流量变现

做网站这行干了十几年,我见过太多让人叹气的项目。尤其是当我们聊到像龙潭古镇这样的文化IP时,很多甲方或者项目负责人脑子里蹦出来的第一个念头往往是:“赶紧弄个好看的页面,把照片放上去,能搜到就行。”这种想法太危险了,也太廉价了。龙潭古镇,这座有着深厚历史底蕴的…

2026/8/14 4:19:04 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →