已解决
Python | 为FastAPI后端服务添加API Key认证(分别基于路径传参和header两种方式且swagger文档友好支持)
来自网友在路上 181881提问 提问时间:2023-09-26 20:25:02阅读次数: 81
最佳答案 问答题库818位专家为你答疑解惑
文章目录
- 01 前言
- 02 路径传参方式添加API Key
- 2.1 完整代码
- 2.2 请求示例
- 2.3 swagger文档测试
- 03 请求头Header方式传入API Key(推荐)
- 3.1 完整代码
- 3.2 请求示例
- 3.3 swagger文档测试
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_keyraise 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_keyraise 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文档测试
配置完成,一切正常!
(完)
查看全文
99%的人还看了
相似问题
- MeterSphere | 接口测试请求体中,int类型的入参实现动态化变量
- postman设置接口关联这样做,薪资直接涨3k
- 接口自动化中cookies的处理技术
- C#中抽象类、抽象方法和接口暨内联临时变量的精彩表达
- 【实战详解】如何快速搭建接口自动化测试框架?Python + Requests
- 一次显著的接口性能优化,从10s优化到0.9s
- 做接口自动化遇到的20个难点,记录下我是如何解决的!
- 全网最全jmeter接口测试/接口自动化测试看这篇文章就够了:跨线程组传递jmeter变量及cookie的处理
- 微信小程序发货信息录入接口 错误上传时间非法,请按照 RFC 3339 格式填写?
- 京东商品详情数据接口【京东API接口开发系列】,监控京东价格走势,接口代码示例,可高并发批量获取
猜你感兴趣
版权申明
本文"Python | 为FastAPI后端服务添加API Key认证(分别基于路径传参和header两种方式且swagger文档友好支持)":http://eshow365.cn/6-14144-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!