fastapi(十七)-安全

内网部署Claude Code:企业级AI模型私有化落地实战 Claude Code并非Anthropic官方直接发布的可执行模型,而是面向代码场景优化的Claude 3系列(如Haiku/Sonnet)在本地推理时的协议封装与调用抽象。其核心原理是通过Ollama的Modelfile机制,将GGUF量化权重、系统提示词与工具定义打包为可复现服务,再经由Anthropic API兼容网关(如FastAPI+llama.cpp)实现/v1/messages接口的协议转换。该方案的技术价值在于满足信创环境适配、数据不出域、等保合规与审计可控等刚性要求,广泛应用于金融、政务 阅读详情

安全介绍
有许多方式去处理安全性,身份认证和授权。
并且它通常是一个复杂而又困难的话题。
fastapi提供一些工具去更容易的处理安全问题。
先来了解一些小的概念
1、OAuth2
OAuth2是一个规范,定义了几种处理身份验证和授权的方式。
它是一个相当广泛的规范,涵盖了几个复杂的用例。
它包括使用“第三方”进行身份验证的方法。
这就是所有带有“使用Facebook,Google,Twitter,GitHub登录”的系统的基础
2、OAuth 1
有一个OAuth 1,它与OAuth2完全不同,并且更为复杂,因为它直接包含有关如何加密通信的规范。
它现在不是很流行或使用。
OAuth2没有指定如何加密通信,它希望您使用HTTPS为您的应用程序提供服务
3、OpenID
OpenID Connect是另一个基于OAuth2的规范。
它只是扩展了OAuth2,以指定一些在OAuth2中相对模糊的内容,以尝试使其更具互操作性。
例如,Google登录使用OpenID Connect(在下面使用OAuth2)。
但是,Facebook登录不支持OpenID Connect。它具有自己的OAuth2风格。
4、OpenAPI
OpenAPI(以前称为Swagger)是用于构建API(现已成为Linux Foundation的一部分)的开放规范。
FastAPI基于OpenAPI。
这就是使多个自动交互式文档界面,代码生成等成为可能的原因。
OpenAPI具有定义多个安全“方案”的方法。
通过使用它们,您可以利用所有这些基于标准的工具,包括这些交互式文档系统。
OpenAPI定义了以下安全方案:

  • apiKey:特定于应用程序的密钥,可以来自:
    • 查询参数。
    • header。
    • cookie。
  • http:标准的HTTP身份验证系统,包括:
    • bearer:标题Authorization的值Bearer加上令牌。这是从OAuth2继承的。
    • HTTP基本身份验证。
    • HTTP摘要等
  • oauth2:所有OAuth2处理安全性的方式(称为“流程”)。
    • 其中一些流程适合构建OAuth 2.0身份验证提供程序(例如Google,Facebook,Twitter,GitHub等):
      • implicit
      • clientCredentials
      • authorizationCode
    • 但是,有一个特定的“流”可以完美地用于直接在同一应用程序中处理身份验证:
      • password:接下来的几章将介绍此示例。
  • openIdConnect:具有定义自动发现OAuth2身份验证数据的方式。 此自动发现是OpenID Connect规范中定义的内容。

fastapi utilities
fastapi提供一些工具给以上的安全模式在fastapi.security模块中。

第一步
想象一下你的后端api在一个域中,而你的前端在另一个域中,或者在相同域中的不同的路径。
并且你想通过用户名和密码来进行前后端授权。
可以使用OAuth2来构建fastapi。
首先来看看它是怎么工作的。

from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")


@app.get("/items/")
async def read_items(token: str = Depends(oauth2_scheme)):
    return {"token": token}

要想让它运行得先安装python-multipart。这是因为OAuth2使用表单数据来发送用户名密码。
运行后可以直接在docs中进行测试。
在这里插入图片描述
目前你无论填入什么都将不起作用。
password flow
密码流是OAuth2中定义得流中得一种方式,去处理安全以及身份验证。
OAuth2被设计来已确保后端或api能够独立于授权用户得服务。
但是这个例子中fastpi程序将会处理api以及授权。
因此,让我们从简化的角度进行回顾:

  • 用户在前端键入他username和和password,然后点击Enter。
  • 前端(在用户的浏览器中运行)发送一个username和password我们的API在一个特定的URL。
  • API会检查username和password,并以“令牌”作为响应
    • 令牌”只是一个包含一些内容的字符串,我们稍后可以使用它来验证该用户。
    • 通常,令牌设置为在一段时间后过期。
      • 因此,用户稍后将不得不再次登录。
      • 而且,如果令牌被盗,则风险会降低。它不像将永远有效的永久密钥(在大多数情况下)。
  • 前端将该令牌临时存储在某个地方。
  • 用户单击前端以转到前端Web应用程序的另一部分。
  • 前端需要从API中获取更多数据。
    • 但是它需要针对该特定端点的身份验证。
    • 因此,为了通过我们的API进行身份验证,它会发送一个标头Authorization,其值Bearer加上令牌。
    • 如果令牌包含foobar,则Authorization标头的内容为:Bearer foobar。
      OAuth2PasswordBearer
      OAuth2PasswordBearer是fastapi提供得使用Bearer token得password流。
      它是客户端使用username 和password来发送并获得token得类。
      oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")
      它并不创建端点路径操作,但是声明客户端得到token得地址。
      然后使用实例作为路径操作得依赖,这个依赖返回得参数是一个str类型得token。

它将会去请求得头部中查找Authorization,验证值是否是Bearer+token并且返回token。
如果头部中没有Authorization,或者值不包括Bearer token,将会返回401.
甚至不用你去检查token是否存在,你可以很确定只要函数被执行了,就能够得到token。
得到当前用户
首先创建用户模型,

class User(BaseModel):
    username: str
    email: Optional[str] = None
    full_name: Optional[str] = None
    disabled: Optional[bool] = None

创建get_current_user 依赖
get_current_user将会依赖oauth2_scheme。并从中得到token。

async def get_current_user(token: str = Depends(oauth2_scheme)):
    user = fake_decode_token(token)
    return user

get_current_user将会使用一个假的功能函数,以token作为参数并返回user模型。

def fake_decode_token(token):
    return User(
        username=token + "fakedecoded", email="john@example.com", full_name="John Doe"
    )

完整代码:

from typing import Optional

from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel

app = FastAPI()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")


class User(BaseModel):
    username: str
    email: Optional[str] = None
    full_name: Optional[str] = None
    disabled: Optional[bool] = None


def fake_decode_token(token):
    return User(
        username=token + "fakedecoded", email="john@example.com", full_name="John Doe"
    )


async def get_current_user(token: str = Depends(oauth2_scheme)):
    user = fake_decode_token(token)
    return user


@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_user)):
    return current_user

在登陆的路径操作中需要以form格式传入username以及password
scope
客户端还可以传入scope参数,这个参数实际是以空格分隔的多个scope。每一个scope都是string。
他们经常被用于声明特殊的安全权限,eg:
users:read or users:write

OAuth2PasswordRequestForm

from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from pydantic import BaseModel

fake_users_db = {
    "johndoe": {
        "username": "johndoe",
        "full_name": "John Doe",
        "email": "johndoe@example.com",
        "hashed_password": "fakehashedsecret",
        "disabled": False,
    },
    "alice": {
        "username": "alice",
        "full_name": "Alice Wonderson",
        "email": "alice@example.com",
        "hashed_password": "fakehashedsecret2",
        "disabled": True,
    },
}

app = FastAPI()


def fake_hash_password(password: str):
    return "fakehashed" + password


oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")


class User(BaseModel):
    username: str
    email: str = None
    full_name: str = None
    disabled: bool = None


class UserInDB(User):
    hashed_password: str


def get_user(db, username: str):
    if username in db:
        user_dict = db[username]
        return UserInDB(**user_dict)


def fake_decode_token(token):
    # This doesn't provide any security at all
    # Check the next version
    user = get_user(fake_users_db, token)
    return user


async def get_current_user(token: str = Depends(oauth2_scheme)):
    user = fake_decode_token(token)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid authentication credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return user


async def get_current_active_user(current_user: User = Depends(get_current_user)):
    if current_user.disabled:
        raise HTTPException(status_code=400, detail="Inactive user")
    return current_user


@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    user_dict = fake_users_db.get(form_data.username)
    if not user_dict:
        raise HTTPException(status_code=400, detail="Incorrect username or password")
    user = UserInDB(**user_dict)
    hashed_password = fake_hash_password(form_data.password)
    if not hashed_password == user.hashed_password:
        raise HTTPException(status_code=400, detail="Incorrect username or password")

    return {"access_token": user.username, "token_type": "bearer"}


@app.get("/users/me")
async def read_users_me(current_user: User = Depends(get_current_active_user)):
    return current_user

OAuth2PasswordRequestForm是一个声明以下body内容的类依赖:

  • username
  • password
  • 可选scope
  • 可选grant_type
  • 可选client_id
  • 可选client_secret

OAuth2PasswordBearer 使fastapi知道他是安全模式,所以它会被直接加到openapi中,而OAuth2PasswordRequestForm仅仅是一个类依赖,你也可以直接自己声明表单参数。fastapi提供它仅仅是使用起来更简单。

第二十七篇:Python 进阶-微服务开发(以 FastAPI 为例) 可以定义多个路由来处理不同的请求,并在路由函数中处理请求参数、验证数据等。if q:定义了一个路由,其中{item_id}是一个路径参数。这意味着当客户端发送一个 GET 请求到类似/items/1这样的路径时,会调用read_item函数。read_item函数接受两个参数,item_id是从路径中提取的整数类型的参数,q是一个查询参数。Query用于对查询参数进行验证和设置默认值,这里q的默认值为None,并且最大长度被限制为 50。在函数内部,根据是否有q参数,返回不同的 JSON 响应。 阅读详情

相关推荐

DDS信号发生器设计避坑指南:从AD9834配置到巴特沃斯滤波实战

本文详细解析了基于AD9834芯片的DDS信号发生器设计中的关键技术要点与常见陷阱,涵盖时钟源选择、寄存器配置时序、巴特沃斯滤波器设计等核心内容。针对中高频段信号质量优化,提供了实用的解决方案和代码示例,帮助工程师规避设计误区,提升信号发生器的性能和稳定性。

2y3u4i5o6p的博客 782

FastAPI 库(Python 的 Web 框架)基本使用指南(一)

FastAPI 库(Python 的 Web 框架)基本使用指南(一)

墨鸦的博客 1万+

matlab中高频变压器怎么找,干货|手把手教你绕制高频变压器

原标题:干货|手把手教你绕制高频变压器绕制一个变压器所需材料:磁芯、骨架、各种铜线、麦拉胶带。变压器参数:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:1380±10%uH漏感:≤44uH引脚分布图: 特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间...

weixin_30895121的博客 2125

fastapi_No.21_安全性_目录权限认证

详细介绍了fastapi中实现路径权限管理的步骤及实施过程

Ethan's Blog 1713

ccproxy 6.61 注册机(纯绿/傻瓜/真正去除线程限制)

导读:   软件介绍   1、 CCPROXY 6.61 注册机(纯绿/傻瓜/真正去除线程限制)   ***前言,这次的升级官方改动不大,据说只是为了不被某些软件当病毒***   附件包中解压即免安装版,CcREGTOOLFF.exe为注册机。   本人继续向大家隆重推出《CCPROXY6.61哎呀……破解版》   还是那个提示:   在此之前,本人还是那句老话想提示大家,CCPROXY是

i53nd的专栏 1万+

RK3568下GPIO模拟串口

在嵌入式开发中,硬件 UART 资源可能被其他外设占用。此时,通过 GPIO 模拟 UART(软串口)成为一种灵活的解决方案。本文基于 RK3568 平台,结合 Linux 内核模块,实现高精度软串口通信,并深入分析关键技术细节。可以看到已经接收到数据了,可以自己创建自定义的设备文件到/dev下,也可以按照串口设备的标准创建一个设备,后面有时间我写一篇和标准串口设备结合的gpio模拟串口文章。RK3568 GPIO 模拟串口(软串口)实现详解。将编译好的驱动放到板子上运行。再写个Makefile。

文石_2009的博客 364

FastAPI 中 OAuth2 scopes 实战:从权限设计到精细化控制

OAuth2 规范中,scopes 是一组用空格分隔的字符串,每个字符串代表一个 "权限标识"。比如常见的users:read,或是 Google 采用的 URL 格式。这些字符串本身没有固定格式要求,但约定俗成会采用 "模块:操作" 的形式,方便理解和管理。通过 FastAPI 集成 OAuth2 scopes,我们实现了从 "粗放式权限控制" 到 "精细化功能授权" 的升级。这种基于标准的实现方式,不仅能无缝对接主流认证平台,还能通过 OpenAPI 文档实现权限体系的可视化。

佑瞻的博客 1074

SGP4/SDP4详解

**SGP4** (Simplified General Perturbations Version 4) 和 **SDP4** (Simplified Deep-space Perturbations Version 4) 是一组**解析轨道预报模型**,用于预测地球轨道卫星的位置和速度。它们是北美防空司令部(NORAD)维护的**TLE**数据格式的标准配套算法。 简单来说:**TLE是卫星轨道的"身份证",而SGP4/SDP4是解读这张身份证的"说明书"**。

ScilogyHunter的博客 590

FastAPI框架中如何提取request请求的内容信息以及request内容大全

答案是不能,我尝试了多次,发现这样是行不通的,后来我定义了一个公共类及属性,在框架的执行层将这个request传递给公共类属性,之后的操作日志统一调用公共类的方法,而公共类中直接拿已经初始化的request即可。除此之外,我们还想知道这个request到底有多少东西可以给我们调用,在查看Fastapi框架之后,我打印了里面不少的属性数据,找到一个属性scope,它包含了request中的很多数据,我们可以将上面的return语句改成如下语名,访问后就能看到所有的数据明细。为主机和端口保存一个命名的二元组。

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 3805

毕设加分项!手把手教你完成基于YOLOv8与PyQt5的多类别目标检测系统——让你的毕设从“完成”到“出色”

从KITTI数据集处理,到YOLOv8模型训练,再到PyQt5界面开发,整个流程其实没有想象中那么难。只要你跟着步骤一步步来,不仅能顺利完成毕设,还能掌握目标检测和GUI开发的核心技能——这些技能在未来的求职、读研中都非常实用。如果过程中遇到问题,别担心!可以去YOLOv8的官方文档、PyQt5论坛找答案,也可以和同学、老师交流。记住,完成毕设的过程也是你技术成长的过程,坚持下去,你会为自己的成果感到自豪。

m0_71589036的博客 179

2023.03.27更新大麦网PC端抢购软件和使用教程

近期发现大麦网页端抢购页面悄然发生变化,之前可以在页面选择票价、档次,并且点击按钮进行购票,现在不行了,新的页面如下图所示。已经安全没有了点击按钮,因此,但是并不代表不能像以前之前那样。

猫敷雪 1万+

open api 的安全设计

Token Auth的优点 Token机制相对于Cookie机制又有什么好处呢? 支持跨域访问: Cookie是不允许垮域访问的,这一点对Token机制是不存在的,前提是传输的用户认证信息通过HTTP头传输.无状态(也称:服务端可扩展行):Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,只需要在客户端的cookie或本地介质存储状态

m13020157417的博客 8606

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

FastAPI 学习之路(二十七)安全校验

fastapi安全校验简单实现

mr~li的博客 651

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

FastAPI 学习之路(十七)上传文件

上传文件

mr~li的博客 3516

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

基于Python的FastAPI后端开发框架如何使用(十七)

我在随笔《》中介绍过如何使用PyInstaller 进行打包处理的一些过程和事项。我们基于Python的FastAPI后端应用,在实际开发的时候,直接运行main.py 进行调试即可,但是部署的时候,我们就需要把它们进行打包处理,这里首选PyInstaller 进行打包。本文详细介绍了,使其能够在目标环境中以独立可执行文件的形式运行,无需安装 Python 解释器或额外依赖。文章面向希望将 FastAPI 服务打包为独立运行服务的开发者,特别适用于企业内部系统或需要简化部署的场景。

xzaTfLt7f的博客 926

FastAPI框架入门教程

FastAPI 凭借四大核心优势成为 Python API 开发的优选:其一,依托类型提示与自动文档功能,大幅减少重复工作,提升开发效率;其二,采用异步架构,具备优异的高并发处理能力,适配生产环境需求;其三,社区生态快速增长,兼容 Starlette 与 Pydantic 扩展,扩展性强;其四,学习门槛低,Python 开发者掌握基础类型提示即可快速构建 API。

stc_ljc的博客 1434

FastAPI 学习之路(三十七)元数据和文档 URL

Swagger UI:服务于 /docs。可以使用参数 docs_url 设置它的 URL。可以通过设置 docs_url=None 禁用它。ReDoc:服务于 /redoc。可以使用参数 redoc_url 设置它的 URL。可以通过设置 redoc_url=None 禁用它。我们一直没有看过redoc,我们今天看下。

mr~li的博客 396

fastapi教程翻译(搬运自用)

fastapi教程翻译(一):了解FastAPI结构 fastapi教程翻译(二):Path参数 fastapi教程翻译(三):Query参数 fastapi教程翻译(四):Request Body(请求体) fastapi教程翻译(五):Query参数 & 字符串验证 fastapi教程翻译(六):Path参数 & 数值验证 fastapi教程翻译(七):Body -...

恰排骨芸豆包嘛的博客 2891

fastapi官方文档翻译 -目录

fastapi官方文档翻译 warmsirius 最新发布 最新评论 目录 fastapi教程翻译(前言):安装和运行 fastapi教程翻译(一):了解FastAPI结构 fastapi教程翻译(二):Path参数 fastapi教程翻译(三):Query参数 fastapi教程翻译(四):Request Body(请求体) fastapi教程翻译(五):Query参数 &amp...

Hiking_Yu的专栏 1万+

FastAPI 学习之路(五十七)校验是否登陆

在之前的分享的中,产生了token,用于做登录的认证,那么产生了token后,登陆携带了token,我们如何校验呢?我们发现,当携带token后返回了当前的用户信息。接下来,我们修改下之前获取用户信息接口,需要依赖登录,返回当前用户信息。3.依赖登录的接口,接收到请求,判断是否在headers中携带token。7.查询到username的token且token相等,我们认为用户登录。②:携带token(如果没有token值,先调用登录接口)2.调用依赖登录的接口,在请求头中携带token。

mr~li的博客 731

FastAPI 从入门到精通 — 完整实战教程

《FastAPI从入门到生产环境实战指南》 摘要: 本文全面讲解FastAPI框架的核心知识点,提供从零开始的完整学习路径。内容涵盖环境搭建、路由参数、请求体验证、数据库集成、JWT认证、WebSocket等核心功能,每个概念均配有可运行的代码示例。通过对比Flask/Django等框架,突出FastAPI在性能(基于Starlette)、开发效率(自动文档生成)和类型安全(Pydantic驱动)方面的优势。文章采用渐进式结构,从基础API开发到生产级项目部署(Docker+Gunicorn),包含测试、错

r13574651213的博客 568

从请求到响应:把 Python 的 FastAPI 和 Uvicorn 讲透

这不是一篇“照着官网抄一遍 Hello World”的入门文。 如果你想真正搞明白:FastAPI 到底解决了什么问题、Uvicorn 到底扮演什么角色、两者如何配合、项目上线时该怎么设计与避坑,那这篇文章就是写给你的。

jiet_h的博客 938

从 TCP 到 JSON:一次 FastAPI + LLM 生产环境 “Unexpected end of JSON input” 的底层剖析

代理层超时TCP 被中断连接被重置网关断开JSON 编码Unicode 问题FastAPI 序列化。

qq_47188574的博客 812

Flask 和 FastAPI 接口定义对比入门

Flask 和 FastAPI 接口定义对比入门

牛牛博士博客 515

# FastAPI 完全教程:从入门到生产级 API 开发

FastAPI 是一个现代、高性能的 Python Web 框架,用于构建 API。技术层职责说明ASGI 服务器异步 HTTP 服务器,负责接收请求StarletteWeb 微框架提供路由、中间件、WebSocket 等 Web 能力Pydantic数据校验基于类型提示做数据验证、序列化、文档生成FastAPIAPI 框架整合上述组件,提供声明式 API 开发体验高性能:与 NodeJS、Go 并肩,是 Python 最快的框架之一。

w_xiaozhu_a的博客 336
上一篇: fastapi(十六)-依赖关系
下一篇: fastapi(十八)-jwt token
vanexph
博客等级 码龄15年 4015粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值