扫描二维码

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

发现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. vue2&vue3&小程序简介

    Vue2.Vue3.小程序页面生命周期详解 本篇将对比 Vue2.Vue3 以及小程序页面/组件的生命周期,简单梳理各自特点.差异.新增优化点. Vue2 生命周期 beforeCreate → cr ...

  2. SSL证书免费申请(阿里云)

    简介 本文介绍SSL证书免费申请流程 注意: 免费单域名证书,可用于测试.个人试用等场景,org.jp等特殊域名存在无法申请的情况,正式环境建议使用付费证书. 每个实名主体个人/企业,一个自然年内可以 ...

  3. Python 潮流周刊#98:t-string 语法被正式接纳了(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  4. 【MOOC】JS脚本|便于复制粘贴中国大学MOOC网站的测试题和选项

    文章目录 运行结果 完整代码 可复用的部分 1. 删除指定Class或Id的DOM元素 2. 在页面上添加按钮并绑定事件.添加css.class 3. 等待页面加载完成,运行异步函数 4. 选中某个D ...

  5. 【安装】各平台下安装低版本CUDA的PyTorch

    目前直接点开官网,看到的安装链接是这样的: 倘若你的系统的CUDA版本恰好是11.2,而且又懒得升级,可以采取指定版本安装的方式装PyTorch: 运行指令,查看自己的显卡的版本号: nvidia-s ...

  6. 【从0到1800 Star】90天,我用0预算推广了一个C语言项目

    亲爱的朋友们,我想和你们分享一下这90多天的开发旅程,虽然不涉及具体的技术部分,但我相信这些经验对你的项目会有所帮助哦 Catime是如何在大约90天内从0做到1800+ star的呢?其中最主要的原 ...

  7. .NET+AI | eShopSupport 知多少

    eShopSupport 项目深度解析 eShopSupport 项目的整体架构示意图.左侧为离线运行的工具(DataGenerator.DataIngestor.Evaluator)用于数据准备和评 ...

  8. SpringAI更新:废弃tools方法、正式支持DeepSeek!

    AI 技术发展很快,同样 AI 配套的相关技术发展也很快.这不今天刚打开 Spring AI 的官网就发现它又又又又更新了,而这次更新距离上次更新 M7 版本才不过半个月的时间,那这次 Spring ...

  9. .NET外挂系列:7. harmony在高级调试中的一些实战案例

    一:背景 1. 讲故事 如果你读完前六篇,我相信你对 harmony 的简单使用应该是没什么问题了,现在你处于手拿锤子看谁都是钉子的情况,那这篇我就找高级调试里非常经典的 3个钉子 让大家捶一锤. 二 ...

  10. L1-1、Prompt 是什么?为什么它能“控制 AI”?

    *--Prompt 入门 L1-1 想象一下,你只需输入一句话,AI 就能自动为你写一篇文案.生成一份报告.甚至规划你的创业计划.这种"对话即编程"的背后魔法,就是 Prompt ...