当前位置: 首页 > article >正文

FastAPI 安全认证

FastAPI 安全认证学习笔记一、认证流程概览FastAPI 的认证通常遵循以下流程客户端发送请求携带凭证如 Token、Cookie。中间件/依赖拦截请求提取凭证。验证逻辑校验凭证有效性如 JWT 签名、密码比对。注入用户将用户信息注入到request.state.user或作为参数传递。路由处理基于用户信息执行业务逻辑。二、OAuth2 with Password Flow (JWT)这是 FastAPI 官方推荐的标准认证方式基于OAuth2 密码流和JWT (JSON Web Token)。1. 核心依赖pipinstallpython-jose[cryptography]passlib[bcrypt]python-jose: 用于生成和验证 JWT。passlib: 用于密码哈希bcrypt。2. 完整实现示例A. 配置与工具函数fromdatetimeimportdatetime,timedeltafromtypingimportOptionalfromjoseimportJWTError,jwtfrompasslib.contextimportCryptContextfromfastapiimportDepends,HTTPException,statusfromfastapi.securityimportOAuth2PasswordBearer,OAuth2PasswordRequestFormfrompydanticimportBaseModel# ---- 配置 ----SECRET_KEYyour-secret-key# 生产环境应从环境变量读取ALGORITHMHS256ACCESS_TOKEN_EXPIRE_MINUTES30# ---- 密码哈希 ----pwd_contextCryptContext(schemes[bcrypt],deprecatedauto)oauth2_schemeOAuth2PasswordBearer(tokenUrltoken)# ---- 模拟数据库 ----fake_users_db{johndoe:{username:johndoe,full_name:John Doe,email:johndoeexample.com,hashed_password:pwd_context.hash(secret),disabled:False,}}# ---- 数据模型 ----classToken(BaseModel):access_token:strtoken_type:strclassTokenData(BaseModel):username:Optional[str]NoneclassUser(BaseModel):username:stremail:Optional[str]Nonefull_name:Optional[str]Nonedisabled:Optional[bool]None# ---- 工具函数 ----defverify_password(plain_password,hashed_password):returnpwd_context.verify(plain_password,hashed_password)defget_password_hash(password):returnpwd_context.hash(password)defget_user(db,username:str):ifusernameindb:user_dictdb[username]returnUser(**user_dict)returnNonedefauthenticate_user(fake_db,username:str,password:str):userget_user(fake_db,username)ifnotuser:returnFalseifnotverify_password(password,user.hashed_password):returnFalsereturnuserdefcreate_access_token(data:dict,expires_delta:Optional[timedelta]None):to_encodedata.copy()ifexpires_delta:expiredatetime.utcnow()expires_deltaelse:expiredatetime.utcnow()timedelta(minutes15)to_encode.update({exp:expire})encoded_jwtjwt.encode(to_encode,SECRET_KEY,algorithmALGORITHM)returnencoded_jwt# ---- 依赖注入获取当前用户 ----asyncdefget_current_user(token:strDepends(oauth2_scheme)):credentials_exceptionHTTPException(status_codestatus.HTTP_401_UNAUTHORIZED,detailCould not validate credentials,headers{WWW-Authenticate:Bearer},)try:payloadjwt.decode(token,SECRET_KEY,algorithms[ALGORITHM])username:strpayload.get(sub)ifusernameisNone:raisecredentials_exception token_dataTokenData(usernameusername)exceptJWTError:raisecredentials_exception userget_user(fake_users_db,usernametoken_data.username)ifuserisNone:raisecredentials_exceptionreturnuserasyncdefget_current_active_user(current_user:UserDepends(get_current_user)):ifcurrent_user.disabled:raiseHTTPException(status_code400,detailInactive user)returncurrent_userB. 路由定义fromfastapiimportFastAPI,Depends,HTTPException,status appFastAPI()app.post(/token,response_modelToken)asyncdeflogin_for_access_token(form_data:OAuth2PasswordRequestFormDepends()):userauthenticate_user(fake_users_db,form_data.username,form_data.password)ifnotuser:raiseHTTPException(status_codestatus.HTTP_401_UNAUTHORIZED,detailIncorrect username or password,headers{WWW-Authenticate:Bearer},)access_token_expirestimedelta(minutesACCESS_TOKEN_EXPIRE_MINUTES)access_tokencreate_access_token(data{sub:user.username},expires_deltaaccess_token_expires)return{access_token:access_token,token_type:bearer}app.get(/users/me/,response_modelUser)asyncdefread_users_me(current_user:UserDepends(get_current_active_user)):returncurrent_userapp.get(/users/me/items/)asyncdefread_own_items(current_user:UserDepends(get_current_active_user)):return[{item_id:Foo,owner:current_user.username}]3. 关键点解析组件作用OAuth2PasswordBearer定义 Token 获取方式/token自动从Authorization: Bearer token提取 Token。pwd_context使用 bcrypt 算法哈希密码防止明文存储。create_access_token生成 JWT包含sub(subject, 通常是用户名) 和exp(过期时间)。get_current_user依赖函数解码 Token 并验证用户是否存在。OAuth2PasswordRequestForm自动解析application/x-www-form-urlencoded表单数据用户名/密码。三、API Key 认证适用于服务间调用或简单场景。1. 自定义 Header 提取fromfastapiimportHeader,HTTPException,statusfromtypingimportOptional API_KEYsuper-secret-api-keyasyncdefverify_api_key(x_api_key:strHeader(...)):ifx_api_key!API_KEY:raiseHTTPException(status_codestatus.HTTP_403_FORBIDDEN,detailInvalid API Key)app.get(/items/)asyncdefread_items(api_key:strDepends(verify_api_key)):return{items:[Item 1,Item 2]}2. 使用APIKeyHeader(推荐)fromfastapiimportAPIRouter,Header,HTTPException,statusfromfastapi.securityimportAPIKeyHeader api_key_headerAPIKeyHeader(nameX-API-Key,auto_errorFalse)asyncdefget_api_key(api_key:strDepends(api_key_header)):ifnotapi_key:raiseHTTPException(status_code403,detailAPI Key missing)ifapi_key!API_KEY:raiseHTTPException(status_code403,detailInvalid API Key)returnapi_keyapp.get(/secure/)asyncdefsecure_endpoint(api_key:strDepends(get_api_key)):return{msg:Access granted}四、HTTP Basic Auth适用于简单的用户名/密码认证不推荐用于生产环境除非配合 HTTPS。fromfastapi.securityimportHTTPBasic,HTTPBasicCredentialsimportsecrets securityHTTPBasic()defverify_password(username:str,password:str)-bool:# 实际项目中应查询数据库并验证哈希returnusernameadminandpasswordsecretapp.get(/users/me)asyncdefget_current_user(credentials:HTTPBasicCredentialsDepends(security)):ifnotverify_password(credentials.username,credentials.password):fromfastapiimportHTTPException,statusraiseHTTPException(status_codestatus.HTTP_401_UNAUTHORIZED,detailIncorrect email or password,headers{WWW-Authenticate:Basic},)return{username:credentials.username}五、角色权限控制 (RBAC)在用户信息中增加角色字段实现权限控制。1. 扩展用户模型classUser(BaseModel):username:strrole:str# admin, user, guest# ... 其他字段2. 创建权限依赖fromfunctoolsimportwrapsdefrequire_role(required_role:str):asyncdefrole_checker(current_user:UserDepends(get_current_active_user)):ifcurrent_user.role!required_role:raiseHTTPException(status_codestatus.HTTP_403_FORBIDDEN,detailOperation not permitted)returncurrent_userreturnrole_checkerapp.delete(/users/{user_id})asyncdefdelete_user(user_id:int,current_user:UserDepends(require_role(admin))):return{msg:fUser{user_id}deleted by{current_user.username}}六、安全最佳实践1. 密码存储必须使用强哈希算法如bcrypt,argon2。禁止明文存储密码。使用passlib库简化哈希操作。2. JWT 安全密钥强度SECRET_KEY必须足够长且随机建议 32 字节以上。过期时间设置合理的exp避免 Token 长期有效。算法使用HS256或RS256避免none算法。存储前端应将 Token 存储在HttpOnly Cookie或localStorage需防范 XSS。3. HTTPS必须在生产环境启用 HTTPS防止 Token 在传输中被窃听。使用HTTPSRedirectMiddleware强制跳转。4. 防止暴力破解限制登录尝试次数如使用slowapi限流。登录失败时返回通用错误信息“Invalid username or password”避免泄露用户是否存在。5. CORS 与认证如果allow_credentialsTrueallow_origins不能为[*]。确保 CORS 配置正确防止跨站请求伪造CSRF。七、完整项目结构建议project/ ├── app/ │ ├── __init__.py │ ├── main.py # 入口配置中间件 │ ├── config.py # 配置项 (SECRET_KEY, DB_URL) │ ├── security.py # 认证逻辑 (JWT, 密码哈希) │ ├── dependencies.py # 依赖注入 (get_current_user) │ ├── models.py # 数据模型 (User, Token) │ ├── routers/ │ │ ├── auth.py # 登录/注册路由 │ │ └── users.py # 受保护的路由 │ └── database.py # 数据库连接 ├── requirements.txt └── .env # 敏感配置八、常见问题排查问题原因解决方案401 UnauthorizedToken 无效/过期/缺失检查Authorization头格式确认 Token 未过期403 Forbidden权限不足检查用户角色确认require_role逻辑JWTDecodeError密钥错误或算法不匹配确认SECRET_KEY和ALGORITHM一致Invalid signatureToken 被篡改检查密钥是否泄露确认签名算法CORS error跨域配置错误检查allow_origins和allow_credentials九、总结FastAPI 提供了强大的安全机制核心在于依赖注入将认证逻辑解耦复用性强。OAuth2 标准支持多种认证流兼容性好。Pydantic 模型自动校验数据格式减少错误。中间件全局处理安全策略如 HTTPS、CORS。推荐实践使用JWT OAuth2 Password Flow作为主要认证方式。配合bcrypt存储密码。生产环境强制HTTPS。使用依赖注入实现细粒度权限控制。

相关文章:

FastAPI 安全认证

FastAPI 安全认证学习笔记 一、认证流程概览 FastAPI 的认证通常遵循以下流程: 客户端 发送请求,携带凭证(如 Token、Cookie)。中间件/依赖 拦截请求,提取凭证。验证逻辑 校验凭证有效性(如 JWT 签名、密码…...

FastAPI 静态文件

FastAPI 静态文件学习笔记 一、基本用法 — StaticFiles 1. 挂载静态文件目录 from fastapi import FastAPI from fastapi.staticfiles import StaticFilesapp FastAPI()# 将 ./static 目录挂载到 /static 路径 app.mount("/static", StaticFiles(directory"…...

FastAPI CORS 跨域

FastAPI CORS 跨域学习笔记 一、什么是跨域问题 1. 同源策略 浏览器遵循同源策略(Same-Origin Policy),限制一个源的网页向另一个源发送请求。 同源 协议 域名 端口 三者一致:URL AURL B是否同源原因http://example.com/ahttp:…...

别再乱用 String 了!底层原理、常量池、拼接陷阱全解析

做java开发,String是每天都在用的类,但是绝大部分人只停留在只会写、只会赋值,底层还不是很了解,很多人都有这样的疑惑:明明都是"abc",为什么 有时候相等、有时候不相等?String 到底…...

LangChain vs LlamaIndex:从编排到数据,一文搞清核心区别

目录 摘要 一、核心区别:一句话版本 二、为什么我会觉得它们很像? 三、核心区别:完整对比 四、用 LangChain 的知识理解 LlamaIndex 五、LlamaIndex 的数据处理主线 1. Document 2. Node 3. Index 4. Retriever 5. QueryEngine 六…...

如何快速上手OpenBoardView:5个实用技巧与完整操作指南

如何快速上手OpenBoardView:5个实用技巧与完整操作指南 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView OpenBoardView是一款功能强大的开源电路板设计文件查看工具,专为替代传统的&…...

btcrecover技术解析:比特币钱包密码恢复引擎的架构与优化实践

btcrecover技术解析:比特币钱包密码恢复引擎的架构与优化实践 【免费下载链接】btcrecover An open source Bitcoin wallet password and seed recovery tool designed for the case where you already know most of your password/seed, but need assistance in tr…...

家庭暴力预警程序,报警,调解记录上链,为庇护,起诉,提供证据。

定位为 “区块链在社会治理与司法辅助中的应用示例”。一、实际应用场景描述在家庭暴力(Domestic Violence, DV)案件中,受害者常面临以下问题:- 暴力行为多为私密空间发生- 证据易灭失(聊天记录删除、伤情恢复&#xf…...

自建代理池实战:从零搭建高可用IP代理服务应对反爬策略

1. 项目概述与核心价值最近在折腾一个个人项目,需要从多个公开的学术网站和开放数据平台抓取一些研究资料。这事儿听起来简单,但实际操作起来,你会发现一个很现实的问题:很多网站对频繁的、来自同一IP的请求非常敏感,轻…...

AI Agent 入门课:RAG 不是检索外挂,而是 Agent 的知识闭环

在企业知识问答里,最常见的失败并不是“完全搜不到”,而是第一次搜到的内容看起来相关,答案也写得流畅,结论却经不起复核。用户问一句“帮我总结这份文档”,普通 RAG 往往会先搜一批材料,再把结果塞回上下文…...

D2DX:让经典《暗黑破坏神2》在现代PC上焕然一新的完整解决方案

D2DX:让经典《暗黑破坏神2》在现代PC上焕然一新的完整解决方案 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你…...

开源RPA框架openclaw-a2a:基于浏览器自动化的跨应用数据流转实践

1. 项目概述与核心价值最近在折腾一些自动化流程,发现很多场景下,不同应用之间的数据流转是个老大难问题。比如,我想把网页上的表格数据自动录入到某个内部系统,或者把邮件附件里的信息提取出来,更新到数据库里。手动操…...

为什么92%的技术中台项目卡在AISMM第三级?资深架构师手把手拆解生态能力建设的黄金48小时启动法

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与技术生态建设的底层逻辑 AISMM(Artificial Intelligence System Maturity Model)并非孤立的评估框架,而是以系统性、演化性与协同性为内核的技术治理范式…...

Windhawk终极指南:如何通过模块化定制彻底改变Windows使用体验

Windhawk终极指南:如何通过模块化定制彻底改变Windows使用体验 【免费下载链接】windhawk The customization marketplace for Windows programs: https://windhawk.net/ 项目地址: https://gitcode.com/gh_mirrors/wi/windhawk Windhawk是一款革命性的Windo…...

车载以太网之要火系列 - 第35篇:郭大侠学UDS(34/36/37服务)- 环环相扣展神奇,丝滑更新不迷离

写在开篇上回说到,郭靖搞清楚了19服务(看病历)和14服务(擦病历)——疾病潜藏祸患多,杏林郎中手段多。这天,郭靖开着那辆国产智能网联新车,感觉有点不对劲——踩油门反应迟钝&#xf…...

opencv 和opencv_contrib官网 不同版本的下载地址

opencv Releases opencv/opencv https://github.com/opencv/opencv_contrib/releases/tag/4.0.1 Release 3.4.13 opencv/opencv_contrib GitHubhttps://github.com/opencv/opencv_contrib/releases/tag/3.4.13 4.0.1 和3.4.13 都是版本号。下载就行。...

HCIE数通单选题

(单选题)EVPN承载L2VPN业务时,以下哪种类型的路由与CE无关? A. MAC/IP Advertisement Route B. Inclusive Multicast Route C. Ethernet A-D Route D. Ethernet Segment Route 思考中。。。 我们来逐一拆解选项: 1. 为…...

2.LeetCode 1089. 复写零——双指针解法学习笔记

目录 一、题目解析 二、算法原理:双指针法 步骤1:找最后一个“复写”的数 步骤2:处理边界情况 步骤3:从后往前复写 三、代码实现(Java) 四、复杂度分析 五、总结 OJ链接:https://leetco…...

中国词元:构建自主AI生态的“云-端“协同战略

在全球化AI竞赛进入白热化的今天,中国科技企业正在探索一条独特的突围路径。当国际科技巨头通过封闭云帝国垄断AI基础设施时,中国产业界提出了"中国词元"的创新概念——通过整合本土模型、国产算力和绿色能源,构建自主可控的AI生态…...

3分钟终极指南:qmcdump轻松解锁QQ音乐加密文件,实现音乐自由播放

3分钟终极指南:qmcdump轻松解锁QQ音乐加密文件,实现音乐自由播放 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/…...

学之思开源考试系统:3步快速搭建专业在线考试平台的完整指南

学之思开源考试系统:3步快速搭建专业在线考试平台的完整指南 【免费下载链接】xzs-mysql 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序,能覆盖到pc机…...

mysql数据库读写分离策略与性能分析_通过中间件实现自动路由

...

本土化赋能:Gitee如何重塑中国开发者的代码托管体验

在数字化转型加速的今天,代码托管平台已成为企业技术基础设施的重要组成部分。对于中国开发者而言,一个能够兼顾性能、合规与本地化支持的平台显得尤为重要。Gitee作为国内领先的代码托管服务,正通过其独特的本土化优势,为开发者提…...

WarcraftHelper:魔兽争霸3终极兼容性修复指南,让经典游戏在现代电脑流畅运行

WarcraftHelper:魔兽争霸3终极兼容性修复指南,让经典游戏在现代电脑流畅运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还…...

Install-TidGi-Windows-x64安装步骤详解(附TidGi知识库搭建教程)

Install-TidGi-Windows-x64.exe是 TidGi(太记)​ 桌面知识管理软件的 Windows 64位 安装包。这玩意儿是基于 TiddlyWiki 做的笔记和知识管理工具,带自动 Git 备份、能当博客用,搞个人知识库的人用得挺多。 一、准备工作 下载安装包…...

集团首都公报:继美国谷歌公司、苹果公司之后,世界第三家手机控制系统公司(即     武汉市放飞炬人控制系统有限公司)今天2026年5月6日9点36分获得官方批准。

集团首都公报:继美国谷歌公司、苹果公司之后,世界第三家手机控制系统公司(即 武汉市放飞炬人控制系统有限公司)今天2026年5月6日9点36分获得官方批准。...

08-MLOps与工程落地——模型注册表与模型服务

模型注册表与模型服务(MLflow Model Registry、Seldon Core) 一、模型注册表概述 1.1 什么是模型注册表? import matplotlib.pyplot as plt from matplotlib.patches import Rectangle, FancyBboxPatch import warnings warnings.filterwarni…...

3分钟手机端刷入Android内核:Horizon Kernel Flasher终极指南

3分钟手机端刷入Android内核:Horizon Kernel Flasher终极指南 【免费下载链接】HorizonKernelFlasher A simple app that can flash AnyKernel flashable zips on android 项目地址: https://gitcode.com/gh_mirrors/ho/HorizonKernelFlasher 还在为刷内核必…...

如何在XSLT中将动态字段值(如姓名)安全注入HTML链接的URL参数

...

【控制】基于使用Koopman算子识别的多面体不确定性LPV系统的鲁棒非线性模型预测控制 附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...