推荐用HTTPBearer提取Bearer格式API Key,若用X-API-Key等自定义Header则须手写依赖函数;HTTPBearer仅提取不校验,校验需自行实现,且注意反向代理透传和Header大小写问题。
FastAPI 中用
提取 API Key 最直接
不推荐手写依赖去解析
Header,FastAPI 官方的
已经封装好标准流程:自动检查 Header 是否存在、是否以
开头、提取 token 字符串。它本质是帮你省掉字符串切分和空值判断这类重复逻辑。
关键点:
默认要求 Header 是
格式,不是
或其他自定义 key —— 如果你已有客户端固定发
,得换方案
它只做提取,不做校验;后续需自行比对密钥是否合法
若想支持
这类非 Bearer 格式,必须自己写依赖函数,不能复用
自定义 Header 认证(如
)必须手写依赖
当你的
前端
或第三方调用约定用
而非
时,
就失效了。这时要写一个普通依赖函数,用
对象手动取 Header。
示例代码片段:
注意:
别把密钥硬
编码
在代码里,应从
环境变量
读取:
生产环境务必用更安全的存储方式(如 Vault、KMS),且避免明文比对,考虑加盐哈希或 token 签名验证
这个函数返回值会注入到
路由
参数中,可选地用于日志或审计
如何在路由中应用 API Key 验证
把上面写的依赖函数传给
,就能保护单个接口或整个 router。
React Native For Android 源码编译 中文WORD版
本文档主要讲述的是React Native For Android 源码编译;希望对大家会有帮助;感兴趣的朋友可以过来看看
下载
常见用法:
保护单个接口:
保护整个 router:
组合多个认证(比如部分接口允许 API Key,部分需要 OAuth2):用
或分别定义不同依赖,但 FastAPI 不自动“或”逻辑,需手动写分支
错误响应默认是 403,如果你希望统一返回 401(Unauthorized),需显式设置
并调整
Header,否则 OpenAPI 文档里会显示为 Forbidden。
容易忽略的部署与调试细节
本地开发时
curl
测试没问题,一上 Nginx 或 Cloudflare 就 403,大概率是反向代理默认过滤了自定义 Header。
排查要点:
Nginx 需显式透传:
(注意大小写转换规则)
Cloudflare 免费版默认剥离所有非标准 Header,需升级或改用
格式
FastAPI 的
不会影响认证逻辑,但错误堆栈可能暴露密钥——确保生产关闭 debug
如果用
,客户端误发
会导致解析失败,报错信息是
,而非密钥错误
Header 名称大小写敏感,但 HTTP 协议规定 Header 名不区分大小写;实际中某些中间件(如某些 CDN)可能按字面匹配,建议统一用小写键名(
)并用
安全获取。
HTTPBearerAuthorizationHTTPBearer"Bearer "HTTPBearerAuthorization: Bearer xxxAPI-KeyX-API-KeyAPI-Key: xxxHTTPBearerX-API-KeyX-API-KeyAuthorizationHTTPBearerRequestfrom fastapi import Depends, HTTPException, Request
from starlette.status import HTTP_403_FORBIDDEN
async def verify_api_key(request: Request):
api_key = request.headers.get("X-API-Key")
if not api_key:
raise HTTPException(status_code=HTTP_403_FORBIDDEN, detail="X-API-Key header missing")
if api_key != "your-secret-key-here": # 实际中建议查数据库或缓存
raise HTTPException(status_code=HTTP_403_FORBIDDEN, detail="Invalid API Key")
return api_key
os.getenv("API_KEY")Depends()def read_items(api_key: str = Depends(verify_api_key)):router = APIRouter(dependencies=[Depends(verify_api_key)])Unionstatus_code=401WWW-Authenticateproxy_set_header X-API-Key $http_x_api_key;Authorization: Bearerdebug=TrueHTTPBearerAuthorization: API-Key xxxCredentials not found in headerx-api-key.get()