Python | 为FastAPI后端服务添加API Key认证(分别基于路径传参和header两种方式且swagger文档友好支持)

2023-09-18 16:06:54


01 前言

FastAPI,如其名所示,是一个极为高效的框架,特别适用于构建 API 后端服务。而在与其他网站的 API 接口进行交互时,API Key认证是一种非常普遍的安全机制。典型的例子是ChatGPT的接口,我们需要申请一个专属的API Key才能发起有效的请求。

虽然我们可以直接在定义接口时自定义接收参数,但这种方式需要在每个接口都增加相同的代码,十分不优雅,且该方式不支持FastAPI自带的swagger文档友好显示。

本文将介绍在FastAPI框架中如何为我们的后端服务添加API Key认证,且使用两种不同的方案实现:一种是将 API Key 放在 URL 请求路径中,另一种是将 API Key 放在请求头(Header)中。

02 路径传参方式添加API Key

2.1 完整代码

import uvicorn
from fastapi import HTTPException, status, Security, FastAPI
from fastapi.security import APIKeyQuery

# 可用的API_KEYS列表
API_KEYS = ["9d207bf0-10f5-4d8f-a479-22ff5aeff8d1", ...]

# 创建一个用于解析路径传参的对象
api_key_query = APIKeyQuery(name="api-key", auto_error=False)

# 定义一个获取请求中的api-key的函数 该函数接收一个上一步创建的对象封装
def get_api_key(api_key: str = Security(api_key_query)) -> str:
    if api_key in API_KEYS:
        return api_key
    raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid or missing API Key")

app = FastAPI()

@app.get("/public")
def public():
    """一个公共接口 无需api-key即可访问"""
    return "Public Endpoint."

# 需要api-key的接口,注意接受参数的写法。
@app.get("/private")
def private(api_key: str = Security(get_api_key)):
    """一个私有端点 需要在请求url中传入api-key"""
    return f"Private Endpoint. API Key: {api_key}"

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

2.2 请求示例

启动应用后,可以使用如下请求来访问“私有端点”:

GET http://localhost:8000/private?api-key=9d207bf0-10f5-4d8f-a479-22ff5aeff8d1

2.3 swagger文档测试

访问接口文档,可以看到有很好的支持。

点击Authorize按钮,填入api-key,这样调用需要认证的接口时就可以自动带上api-key了。

在这里插入图片描述

03 请求头Header方式传入API Key(推荐)

3.1 完整代码

这种方式相对前一种方式会更安全一些,推荐。

"""为请求添加api-key的示例 api-key通过header的方式发送"""
import uvicorn
from fastapi import HTTPException, status, Security, FastAPI
from fastapi.security import APIKeyHeader

# 可用的API_KEYS列表
API_KEYS = ["9d207bf0-10f5-4d8f-a479-22ff5aeff8d1", ...]

# 创建一个用于解析路径传参的对象
api_key_header = APIKeyHeader(name="api-key", auto_error=False)

# 定义一个获取请求中的api-key的函数 该函数接收一个上一步创建的对象封装
def get_api_key(api_key: str = Security(api_key_header)) -> str:
    if api_key in API_KEYS:
        return api_key
    raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid or missing API Key")

app = FastAPI()

@app.get("/public")
def public():
    """一个公共接口 无需api-key即可访问"""
    return "Public Endpoint."

# 需要api-key的接口,注意接受参数的写法。
@app.get("/private")
def private(api_key: str = Security(get_api_key)):
    """一个私有端点 需要在请求url中传入api-key"""
    return f"Private Endpoint. API Key: {api_key}"

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

3.2 请求示例

启动应用后,你可以使用如下 curl 命令来访问“私有端点”:

curl -H "api-key: 9d207bf0-10f5-4d8f-a479-22ff5aeff8d1" http://localhost:8000/private

3.3 swagger文档测试

在这里插入图片描述

在这里插入图片描述

配置完成,一切正常!

(完)

更多推荐

RockyLinux安装MariaDB

文章目录1前言2参考3开始安装3.1运行官方脚本添加MariaDB的源3.2安装MariaDBServer3.3启动MariaDB4SSH登录MariaDB4.1ssh上使用root账号登录4.2新建管理员账号并授权5放行端口33065.1VirtualBox上设置端口转发5.2RockyLinux防火墙放行3306端

自定义linux cp命令

基本要求:1.基本要求,实现文件的复制。编写程序实现cp命令的功能,程序源文件名为mycp.c,使用方法为:./mycp源文件名目标文件名2.扩展要求,当目标文件已存在时,给出提示是否进行覆盖,并根据用户的回应进行相应的操作。3.扩展要求,在上一步实现功能的基础上,为mycp增加选项,如果选项为-f,则当目标文件已存在

OpenAI即将推出新一代AI模型DALL-E 3;用AI进行天然产物药物发现的综述

🦉AI新闻🚀OpenAI即将推出新一代AI模型DALL-E3摘要:OpenAI正在准备推出下一代AI模型DALL-E3,并已进行了一系列Alpha测试。据分享,5月的测试版已能生成多种长宽比的图像,支持更长的提示语句,并生成“正常的文字”。然而,7月的版本可能会生成一些不适当的场景和受版权保护的商标图案。OpenA

台积电没有想到,当初拒绝的中国芯片企业,如今反过来抢夺市场了,后悔莫及...

台积电二季度的营收已经出现下滑,本来它希望四季度在以往苹果销售旺季的支持下再度推高收入,然而如今中国手机企业自研的国产5G芯片正在反过来抢占市场,台积电四季度的收入恐怕也将下降。苹果的销售旺季为每年的四季度,不过此时恰逢一家中国手机企业发布国产5G手机,采用了完全国产化的5G手机芯片,虽然都未知这款芯片的代工厂商,但可

Linux安装vivado方法

76585-Vivado2020.x-couldn'tloadfile"librdi_commontasks.so":libtinfo.so.5:cannotopensharedobjectfile:NosuchfileordirectoryUbuntu20.04userscanalsoinstallthelibtin

基于图像形态学处理和边缘提取算法的路面裂痕检测matlab仿真

目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览2.算法运行软件版本matlab2022a3.部分核心程序[Rr,Cc]=size(Image1);%获取Image1矩阵的大小(行数和列数)%创建一个高斯滤波器G,大小为9x9,标准差为3G=fsp

如何在Ubuntu系统部署RabbitMQ服务器并公网访问【内网穿透】

文章目录前言1.安装erlang语言2.安装rabbitMQ3.内网穿透3.1安装cpolar内网穿透(支持一键自动安装脚本)3.2创建HTTP隧道4.公网远程连接5.固定公网TCP地址5.1保留一个固定的公网TCP端口地址5.2配置固定公网TCP端口地址前言RabbitMQ是一个在AMQP(高级消息队列协议)基础上完

区块链技术:解密去中心化的革命

文章目录区块链的基础概念什么是区块链?区块链的核心原理1.分布式账本2.区块3.加密技术4.共识机制区块链的工作原理区块链的交易过程区块链的安全性共识机制的作用区块链的应用领域1.金融服务2.供应链管理3.物联网4.医疗保健5.政府与公共服务区块链的未来展望1.去中心化金融2.物联网的安全性3.智能合约的广泛应用4.数

数字森林:无人机航测技术在林业调查中的应用

林业调查是林业工作的基础,对于森林资源的管理、规划、保护、经济发展和农业种植等方面都具有重要的意义。传统林业调查主要依赖人工进行,存在工作效率低、数据精度低、数据分析困难、受地形限制、无法实时监测等缺陷。随着科技的不断发展,无人机作为一种高效、灵活的工具,正在越来越多的领域得到应用。无人机航测利用无人机搭载的航摄设备,

数据通信——传输层TCP(超时时间选择)

引言TCP每一次发送报文段,就会对这个报文段设置一次计时器。如果时间到了却没有收到确认报文,那么就要重传该报文。这个之前在TCP传输的机制中提到过,这个章节就来研究一下超时时间问题。关于加权的概念有必要提及一下加权的概念,这属于数学知识,但可用帮助我们理解超时重传机制。权是在测量时不同的精准度,加权就是乘上权重/系数的

并发编程——JUC并发工具

文章目录前言CountDownLatchCountDownLatch应用CountDownLatch核心源码SemaphoreSemaphore应用Semaphore核心源码CyclicBarrierCyclicBarrier应用CyclicBarrier核心源码总结前言JUC是Java并发编程工具类库,提供了一些常用

热文推荐