【Python】FastAPI:Token认证

FastAPI:Token认证

本教程通过 FastAPI 实现用户登录和基于 JWT(JSON Web Token) 的认证与授权,适合初学者到进阶用户。教程特别关注 DependsOAuth2PasswordBearer 等非基础操作的详细讲解,帮助你全面掌握相关技术。

环境准备

首先,确保安装必要的依赖库:

pip install fastapi uvicorn PyJWT

什么是 JWT

JWT (JSON Web Token) 是一种轻量级的认证机制,常用于客户端与服务器之间的通信。它主要包含三部分:

  • Header:算法与类型。
  • Payload:包含用户信息及声明。
  • Signature:用于校验数据完整性。

JWT 示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MjMyMzAwMH0
.Wu6HB7pCDHgVvmD3_a8Ev9fGzY1Kc0FnVmCvO1Wl1qM

用户登录的基础实现

创建一个简单的用户登录接口,验证用户名和密码。首先实现模拟的用户数据库和基本的登录验证:

from fastapi import FastAPI, HTTPException
from fastapi.security import OAuth2PasswordRequestFormapp = FastAPI()# 模拟用户数据库
USERS_DB = {"admin": "password123","user": "mypassword"
}@app.post("/login")
async def login(form_data: OAuth2PasswordRequestForm):"""登录接口,验证用户名和密码是否匹配。"""username = form_data.usernamepassword = form_data.passwordif username not in USERS_DB or USERS_DB[username] != password:raise HTTPException(status_code=401, detail="用户名或密码错误")return {"message": f"欢迎回来,{username}!"}

启动服务:

uvicorn main:app --reload

访问 http://127.0.0.1:8000/docs,测试 /login 接口。

JWT 的生成与验证

引入 PyJWT 生成令牌。我们将为成功登录的用户生成一个包含身份信息和过期时间的 JWT。

import jwt
import datetimeSECRET_KEY = "your_secret_key"  # 替换为你的密钥
ALGORITHM = "HS256"            # 签名算法
TOKEN_EXPIRE_HOURS = 1         # 令牌有效时间(小时)def create_jwt(username: str) -> str:"""生成 JWT。"""payload = {"sub": username,  # 用户名"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=TOKEN_EXPIRE_HOURS)  # 过期时间}return jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)@app.post("/login")
async def login(form_data: OAuth2PasswordRequestForm):"""登录接口:验证用户名密码并返回 JWT。"""username = form_data.usernamepassword = form_data.passwordif username not in USERS_DB or USERS_DB[username] != password:raise HTTPException(status_code=401, detail="用户名或密码错误")token = create_jwt(username)return {"access_token": token, "token_type": "bearer"}

FastAPI 的认证工具

什么是 Depends

Depends 是 FastAPI 中的依赖注入工具,用于在路由中动态引入逻辑。例如,可以通过它获取登录用户的 Token,或者验证 Token 的合法性。

什么是 OAuth2PasswordBearer

OAuth2PasswordBearer 是 FastAPI 提供的一个工具,帮助我们解析 Bearer Token。它会从请求头的 Authorization 字段中提取 Token。

使用示例

from fastapi.security import OAuth2PasswordBeareroauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")  # 指定获取 Token 的登录端点
  • 当我们在路由中依赖 oauth2_scheme 时,它会自动解析 Token,并作为参数传递给路由函数。

实现受保护路由和 Token 验证

我们在这里验证 Token 的有效性,并返回用户信息。

from fastapi import Dependsdef decode_jwt(token: str):"""验证并解码 JWT。"""try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])return payloadexcept jwt.ExpiredSignatureError:raise HTTPException(status_code=401, detail="令牌已过期")except jwt.InvalidTokenError:raise HTTPException(status_code=401, detail="令牌无效")@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):"""受保护的路由,需提供有效 JWT。"""payload = decode_jwt(token)username = payload.get("sub")if not username:raise HTTPException(status_code=401, detail="令牌无效")return {"message": f"欢迎回来,{username}!这是一个受保护的路由。"}
  1. 使用 /login 接口获取 Token。
  2. 访问 /protected,并在 Authorization 请求头中添加 Bearer <your_token>

优化代码结构(解耦与扩展)

为了更好的维护和扩展,将用户管理和 JWT 逻辑拆分到独立模块中。

# services/user_service.py
class UserService:"""用户服务类:处理用户验证。"""def __init__(self):self.users_db = {"admin": "password123","user": "mypassword"}def authenticate(self, username: str, password: str) -> bool:"""验证用户名和密码是否匹配。"""return self.users_db.get(username) == password
import jwt
import datetime
from fastapi import HTTPExceptionclass JWTHandler:"""JWT 工具类:负责生成和验证 JWT。"""SECRET_KEY = "your_secret_key"ALGORITHM = "HS256"@staticmethoddef create_token(username: str) -> str:payload = {"sub": username,"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1)}return jwt.encode(payload, JWTHandler.SECRET_KEY, algorithm=JWTHandler.ALGORITHM)@staticmethoddef decode_token(token: str):try:return jwt.decode(token, JWTHandler.SECRET_KEY, algorithms=[JWTHandler.ALGORITHM])except jwt.ExpiredSignatureError:raise HTTPException(status_code=401, detail="令牌已过期")except jwt.InvalidTokenError:raise HTTPException(status_code=401, detail="令牌无效")
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from user_service import UserService
from jwt_handler import JWTHandlerapp = FastAPI()
user_service = UserService()
jwt_handler = JWTHandler()oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")@app.post("/login")
async def login(form_data:OAuth2PasswordRequestForm = Depends()):if not user_service.verify_user(form_data.username, form_data.password):raise HTTPException(status_code=401, detail="用户名或密码错误")token = jwt_handler.create_token(form_data.username)return {"access_token": token, "token_type": "bearer"}@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):payload = jwt_handler.decode_token(token)username = payload.get("sub")return {"message": f"欢迎回来,{username}!"}if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)

总结

通过本教程,你学会了:

  1. 基于 FastAPI 实现用户登录和 JWT Token 认证。
  2. 使用 DependsOAuth2PasswordBearer 实现认证逻辑。
  3. 解耦代码结构,提升可扩展性。

可以进一步扩展功能,比如引入数据库存储用户信息或添加刷新 Token 的机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19908.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

蓝队技能-应急响应篇Rookit后门进程提取网络发现隐藏技术Linux杀毒OpenArk

知识点&#xff1a; 1、应急响应-Windows-Rootkit-分析&清除 2、应急响应-Linux-Rootkit-分析&查毒&清除 内存马和rookit都是属于权限维持技术&#xff0c; 内存马一般是用来控制网站&#xff0c;rookit一般是用来控制服务器&#xff08;隐藏常规C2后门&#xff…

MAC创建一个自动操作,启动系统【睡眠】功能,并将绑定快捷键

目的 通过 Automator 创建一个服务来启动系统【睡眠】这个功能&#xff0c;并绑定快捷键。 步骤一&#xff1a;创建 Automator 服务 打开 Automator&#xff1a; ○ 在 Spotlight 中搜索 Automator&#xff0c;然后打开。选择服务类型&#xff1a; ○ 在 Automator 的启动界…

OpenLayers教程11_在OpenLayers中启用WebGL渲染

在 OpenLayers 中启用 WebGL 渲染&#xff1a;提高地图渲染性能的完整指南 目录 一、引言二、WebGL 渲染在 Web GIS 中的作用 WebGL 的优势WebGL 与 Canvas 渲染的区别 三、在 OpenLayers 中启用 WebGL 的方法四、代码实现步骤 1. 初始化地图和基本 WebGL 渲染2. 加载大规模点…

利用Matlab函数实现深度学习算法

深度学习是一种机器学习技术&#xff0c;其核心是构建多层神经网络&#xff0c;通过深入的学习来实现对数据的有效建模和分析。在深度学习的发展过程中&#xff0c;产生了许多算法和框架&#xff0c;Matlab是其中之一&#xff0c;提供了大量的深度学习函数&#xff0c;可以帮助…

每日OJ题_牛客_dd爱旋转_模拟_C++_Java

目录 牛客_dd爱旋转_模拟 题目解析 C代码 Java代码 牛客_dd爱旋转_模拟 dd爱旋转 输入描述&#xff1a; 第一行一个数n(1≤n≤1000)&#xff0c;表示矩阵大小 接下来n行&#xff0c;每行n个数&#xff0c;描述矩阵&#xff0c;其中数字范围为[1,2000] 一下来一行一个数q(1…

从零开始打造个人博客:我的网页设计之旅

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

【C语言】操作符2(含操作符的应用)

1、单目操作符 单目操作符有下面几种&#xff1a; &#xff01;、、--、&&#xff08;取地址&#xff09;、*&#xff08;指针&#xff09;、&#xff08;正号&#xff09;、-&#xff08;负号&#xff09;、~、sizeof、&#xff08;类型&#xff09; 其中就还有&和*操…

博客文章怎么设计分类与标签

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;博客文章怎么设计分类与标签 新网站基本上算是迁移完了&#xff0c;迁移之后在写文章的过程中&#xff0c;发现个人的文章分类和标签做的太混乱了&#xff0c;分类做的像标签&#xff0c;标签也不是特别的丰富&#x…

【计算机网络】物理层

&#x1f3af; 导读&#xff1a;本文档概述了计算机网络物理层的基础知识&#xff0c;包括物理层的作用、四大任务、传输媒体分类及其特性&#xff0c;深入讲解了调制技术和编码方法如曼彻斯特编码等&#xff0c;探讨了信道的极限容量&#xff0c;介绍了奈氏准则和香农公式&…

【AI赋能电商】数据分析和训练精准导向

AI赋能电商&#xff1a;重塑销售效率与用户体验的新篇章 一、AI驱动的购物推荐系统二、会员分类与精细化运营三、智能商品定价策略四、AI在供应链管理中的应用结语 在当今这个技术日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;已不再是一个遥不可及的概念&…

多组织对接方案案例

前言 不同组织间的数据共享和整合&#xff0c;以便实现库存、订单的实时同步。多组织的对接需求往往一个销售订单需要再不同的组织生成不一样的单据&#xff0c;并且完成内部结算&#xff0c;这个案例对接的是金蝶云星空&#xff0c;具备多组织的特性&#xff0c;所以在前期规…

基于YOLOv8深度学习的医学影像肝脏肿瘤病症检测与诊断系统(PyQt5界面+数据集+训练代码)

随着医学影像技术和计算机视觉技术的快速发展&#xff0c;医疗诊断中的自动化工具正逐渐成为临床应用中的研究热点。在肝脏肿瘤的早期检测与诊断中&#xff0c;传统的人工方法耗时较长&#xff0c;且容易受医生的主观经验影响&#xff0c;诊断结果的准确性和一致性难以保证。基…

table元素纯css无限滚动,流畅过度

<template><div class"monitor-table-container"><table class"monitor-table"><thead><th>标题</th><th>标题</th><th>标题</th><th>标题</th></thead><tbody ref&quo…

springboot-事务失效以及排查过程

排查了好久&#xff0c;终于解决&#xff0c;希望这次的排查过程对大家也有帮助&#xff0c;废话少说&#xff0c;上源码 开发环境 springboot 2.3.11 jdk8 gradle6.4 HikariDataSource ps: 本环节使用双数据源&#xff0c;在service层做切面拦截&#xff0c;切换具体的数据源…

Docker入门之Windows安装Docker初体验

在之前我们认识了docker的容器&#xff0c;了解了docker的相关概念&#xff1a;镜像&#xff0c;容器&#xff0c;仓库&#xff1a;面试官让你介绍一下docker&#xff0c;别再说不知道了 之后又带大家动手体验了一下docker从零开始玩转 Docker&#xff1a;一站式入门指南&#…

信息与网络安全

1.对称密码体制的优缺点 优点&#xff1a;1.加密解密处理速度快 2.保密度高&#xff1b; 缺点&#xff1a;1.对称密码算法的密钥 分发过程复杂&#xff0c;所花代价高 2.多人通信时密钥组合的数量会出现爆炸性膨胀&#xff08;所需密钥量大&#xff09; 3.通信双方必须统一密钥…

GPT、Python和OpenCV支持下的空天地遥感数据识别与计算

在科技飞速发展的时代&#xff0c;遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究&#xff0c;空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。然而&#xff0c;对于许多专业人士而言&#xff0c;如何高效地处…

STM32完全学习——外部中断

一、嵌套向量中断控制器 我们在这里使用标准库的方式来处理。因此只需要调用几个函数就可以了。 NVIC_InitTypeDef NVIC_InitStruct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中断优先级分组 分1组NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); …

【动手做】安装Miniconda和jupyter notebook环境实现线性回归

Miniconda提供快速、简便的Python环境管理&#xff0c;包括安装、运行和更新软件包及其依赖项。Jupyter Notebook是一个交互式笔记本&#xff0c;在机器学习研究中广泛使用。本文旨在进行基础的环境配置&#xff0c;为后续的机器学习实践打好基础。 Miniconda与Jupyter Notebo…

7-简单巡检

KES的版本与license有效期 简单而又会产生灾难性的问题 使用version函数查看KES版本信息 test# select version();查看license有效期 test# select get_license_validdays(); 服务器的时区和时间 查看KES服务器的时区 test# show timezone; test# show time_zone; #两者皆…