扫描二维码

关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

FastAPI 安全与认证综合实战

通过三层防护体系实现API安全:

  1. 传输层:HTTPS + CORS配置
  2. 认证层:OAuth2 + JWT令牌
  3. 权限层:RBAC模型 + 操作日志审计

一、JWT 认证联调方案

sequenceDiagram
participant 用户
participant FastAPI
participant 数据库
用户->>FastAPI: 提交用户名密码
FastAPI->>数据库: 验证凭证
数据库-->>FastAPI: 返回用户数据
FastAPI->>FastAPI: 生成JWT令牌
FastAPI-->>用户: 返回access_token
用户->>FastAPI: 携带Bearer token
FastAPI->>FastAPI: 解码验证token
FastAPI->>数据库: 获取用户权限
FastAPI-->>用户: 返回受保护资源

实现步骤

# 安装依赖:pip install python-jose[cryptography]==3.3.0 passlib==1.7.4
from jose import JWTError, jwt
from datetime import datetime, timedelta SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30 def create_access_token(data: dict):
to_encode = data.copy()
expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) async def get_current_user(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=401,
detail="无法验证凭证",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
except JWTError:
raise credentials_exception
return username

二、OAuth2 集成实现

graph TD
A[用户] -->|登录| B(认证服务器)
B -->|授权码| A
A -->|提交授权码| C[客户端]
C -->|换取令牌| B
B -->|访问令牌| C
C -->|访问资源| D[资源服务器]

第三方登录配置

# 配置示例:pip install authlib==1.0.1
from fastapi.security import OAuth2AuthorizationCodeBearer oauth2_scheme = OAuth2AuthorizationCodeBearer(
authorizationUrl='https://provider.com/auth',
tokenUrl='https://provider.com/token',
scopes={"read": "读取权限", "write": "写入权限"}
) @app.get("/login/google")
async def login_google():
return RedirectResponse(
url=(
"https://accounts.google.com/o/oauth2/auth"
"?response_type=code"
"&client_id=your-client-id"
"&redirect_uri=http://localhost:8000/callback"
"&scope=openid%20profile%20email"
)
)

三、渗透测试实战案例

flowchart TB
A[信息收集] --> B[漏洞扫描]
B --> C{存在漏洞?}
C -->|是| D[渗透攻击]
C -->|否| E[生成报告]
D --> F[权限提升]
F --> G[数据窃取]
G --> E
  1. XSS测试:在输入字段注入 <script>alert(1)</script>
  2. SQL注入测试:' OR 1=1 --
  3. 越权访问测试:修改用户ID参数
  4. SQL 注入防护方案
# 使用SQLAlchemy防止注入(pip install sqlalchemy==1.4.46)
from sqlalchemy import text @app.get("/items/")
async def read_items(name: str):
# 错误写法:f"SELECT * FROM items WHERE name = '{name}'"
query = text("SELECT * FROM items WHERE name = :name")
result = await database.execute(query, {"name": name})
return result.fetchall()

课后 Quiz

  1. 问题:JWT 令牌应该存储在客户端的哪个位置最安全?

    • A) localStorage
    • B) sessionStorage
    • C) HTTPOnly Cookie
    • D) URL 参数

    答案:C。HTTPOnly Cookie 可以防止XSS攻击窃取令牌,配合Secure和SameSite属性使用更安全。

  2. 问题:当收到401 Unauthorized响应时,首先应该检查:

    • A) 路由配置
    • B) 令牌有效期
    • C) 数据库连接
    • D) 请求头格式

    答案:B。令牌过期是最常见的401错误原因,需检查令牌生成时间和有效期设置。

常见报错处理

错误现象:422 Validation Error

{
"detail": [
{
"loc": [
"body",
"password"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}

解决方案

  1. 检查请求体是否包含所有必填字段
  2. 验证请求头 Content-Type 是否为 application/json
  3. 使用 Pydantic 模型进行数据验证:
class UserCreate(BaseModel):
username: str = Field(min_length=3)
password: str = Field(min_length=8, regex="^(?=.*[A-Za-z])(?=.*\d).{8,}$")

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

,阅读完整的文章:如何在FastAPI中玩转JWT认证与OAuth2集成,同时确保安全无虞?

往期文章归档:

免费好用的热门在线工具

如何用三层防护体系打造坚不可摧的 API 安全堡垒?的更多相关文章

  1. 利用koa打造restful API

    概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...

  2. 就这么简单!构建强大的WebShell防护体系

    接触web安全中,例如上传一句话WebShell实现上传文件的功能,再通过上传的多功能WebShell,执行病毒文件最终创建远程连接账号,达到入侵目标服务器的效果.我们可以看到,webshell在整个 ...

  3. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  4. 利用koa打造jsonp API

    概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...

  5. java EE技术体系——CLF平台API开发注意事项(4)——API生命周期治理简单说明

    文档说明 截止日期:20170905,作者:何红霞,联系方式:QQ1028335395.邮箱:hehongxia626@163.com 综述 有幸加入到javaEE技术体系的研究与开发,也得益于大家的 ...

  6. java EE技术体系——CLF平台API开发注意事项(1)——后端开发

    前言:这是一篇帮助小伙伴在本次项目中快速进入到java EE开发的一些说明,为了让同组小伙伴们开发的时候,有个清晰点的思路.昨天给大家演示分享了基本概况,但没有留下文字总结说明,预防后期有人再次问我, ...

  7. 使用.net6 WebApplication打造最小API

    .net6在preview4时给我们带来了一个新的API:WebApplication,通过这个API我们可以打造更小的轻量级API服务.今天我们来尝试一下如何使用WebApplication设计一个 ...

  8. SphereEx 登陆 ApacheCon Asia|依托 ShardingSphere 可插拔架构体系打造数据应用完整生态

    2021 年 8 月 8 日,ApacheCon 首次亚洲大会于线上正式闭幕.作为久负盛名的开源盛宴,本届 ApacheCon Asia 受到了海内外众多开源领域人士的关注. 作为 Apache 软件 ...

  9. 如何用腾讯云打造一款微视频APP

    版权声明:本文由腾讯云原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/196 来源:腾云阁 https://www.qclo ...

  10. sql注入之一次艰难的绕过-三层防护(oracle)

    打开:www.xxxx.com/news/detail.jsp?id=2862 我们经过测试知道此处含有sql注入.我们尝试下: http://www.xxxxxx.com/news/detail.j ...

随机推荐

  1. 【Ubuntu】Ubuntu 配置镜像源(ARM)

    [Ubuntu]Ubuntu 配置镜像源(ARM) 零.起因 最近在QEMU中安装了个ubuntu-24.04-live-server-arm64,默认是国外的软件源,很慢,故替换到国内. 壹.替换 ...

  2. 1001: 【编程入门】A+B 输入输出练习I

    1001: [编程入门]A+B 输入输出练习I[https://www.cyccfoj.com/problem.php?id=1001] ''' 题目描述 你的任务是计算a+b.这是为了acm初学者专 ...

  3. leetcode每日一题:使所有字符相等的最小成本

    题目 2712. 使所有字符相等的最小成本 给你一个下标从 0 开始.长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 ...

  4. 小了 60,500 倍,但更强;AI 的“深度诅咒”

    作者:Ignacio de Gregorio 图片来自 Unsplash 的 Bahnijit Barman 几周前,我们看到 Anthropic 尝试训练 Claude 去通关宝可梦.模型是有点进展 ...

  5. AI应用部署本地步骤

    训练 微调 Ollama Gpt-Sovits Stable-Diffusion

  6. 🎀idea import配置

    简介 本文记录idea中import相关配置:自动导入依赖.自动删除无用依赖.避免自动导入*包 自动导入依赖 在编辑代码时,当只有一个具有匹配名称的可导入声明时,会自动添加导入 File -> ...

  7. python实例:爬取caoliu图片,同时下载到指定的文件夹内

    本脚本主要实现爬取caoliu某图片板块,前3页当天更新的帖子的所有图片,同时把图片下载到对应帖子名创建的文件夹中 爬虫主要通过python xpath来实现,同时脚本内包含,创建文件夹,分割数据,下 ...

  8. 36条技巧优化PHP代码(总结)

    原文:38条技巧优化PHP代码 1.如果一个方法能被静态,那就声明他为静态的,速度可提高1/4; 2.echo的效率高于print,因为echo没有返回值,print返回一个整型; 3.在循环之前设置 ...

  9. NetCAT:来自网络的实用缓存攻击

    不断增加的外围设备正在增加现代处理器中内存管理子系统的压力,例如:DRAM的可用吞吐量已经不能满足现代网卡的传输速率.为了达到承诺的传输性能,Intel处理器使IO操作直接在末级缓存(LLC)上进行, ...

  10. IEC101、IEC103、IEC104、Modbus报文解析工具

    一.概述 国际电工委员会第57技术委员会(IEC TC57)1995年出版IEC 60870-5-101后,得到了广泛的应用.为适应网络传输,2000年IEC TC57又出版了IEC 60870-5- ...