扫描二维码

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

发现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. nodejs参数的处理与用户的交互

    解析脚本参数 作为脚本或者命令行工具,一般都需要支持不同的用户参数.默认参数被保存在process.argv的数组中,如下: [ nodeBinary, script, arg0, arg1, ... ...

  2. CH9121 FTP使用详解

    一.FTP简介: FTP是基于TCP应用层的网络文件传输协议,支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式).采用明文通信不加密. 1.Port模式 ...

  3. Mono GC

    1.虽然是stw但mark阶段可以concurrent 2.并行mark就需要写屏障 3.unity的gc也不是扫描整个堆内存 https://schani.wordpress.com/2012/12 ...

  4. vue2鼠标事件

    1.单击 @click 2.按下 @mousedown 3.抬起 @mouseup 4.双击 @dblclick 5.移动 @mousemove 6.移除 @mouseout 7.离开 @mousel ...

  5. Git撤销本地commit(未push)

    查询commit日志 git log 查询到自己commit的上个版本id(commit_id) 撤销(这里是放弃自己commit的更改,直接回退到上个版本源码) git reset --hard c ...

  6. python,获取当前日期且以当前日期为名称创建文件名

    爬虫爬取信息时,需要把爬取的内容存到txt文档中,且爬虫是每天执行,以日期命名能避免出现名称重复等问题,解决方法如下 import time import os import sys path = o ...

  7. DPDI(Dispatch PDI)kettle调度管理平台介绍

    DPDI online产品简介 DPDI Online 是一款基于Kettle的强大在线任务调度平台,凭借其高效与灵活性,专为调度和监控Kettle客户端生成的ETL任务而设计 DPDI Online ...

  8. Vue(七)——事件处理

    前情提要: v-on--监听DOM事件,在触发时运行js代码 在内联语句处理器中访问原始的 DOM 事件.可以用特殊变量 $event 把它传入方法 示例: <div id="exam ...

  9. [Ubuntu 20.04] 修复‘systemd-shutdown[1]: waiting for process: crond’需等待1分半钟的问题

    由于在2020-2021年期间下载过Linux版本的Free Download Manager(简称FDM,一款免费但不开源的跨平台下载工具),而该软件的官网被挂了木马,因此在此期间下载安装过FDM的 ...

  10. Spring--IOC注解用法初探

    创建一个UserDao接口,和一个UserDaoImp的实现类 UserDao接口 package com.zjw.spring.demo1; public interface UserDao { p ...