FastAPI如何同时支持Header与URL参数的API密钥认证?
实现FastAPI同时支持Header和URL参数的API密钥认证
要实现优先校验x-api-key请求头、再校验URL参数api_key的认证逻辑,完全可以通过自定义FastAPI依赖函数来完成,具体实现步骤如下:
1. 编写密钥验证逻辑
先封装一个通用的密钥有效性判断函数,替换成你实际的验证规则(比如对比配置文件、数据库存储的合法密钥):
def is_valid_api_key(api_key: str) -> bool: # 示例:固定密钥验证,实际场景请替换为你的业务逻辑 return api_key == "mysecretkey"
2. 自定义认证依赖函数
利用FastAPI的Request对象,依次从Header和URL参数中提取密钥并验证:
from fastapi import Depends, Request, HTTPException, status def get_valid_api_key(request: Request): # 优先读取Header中的x-api-key header_key = request.headers.get("x-api-key") if header_key and is_valid_api_key(header_key): return header_key # Header无有效密钥时,读取URL参数中的api_key query_key = request.query_params.get("api_key") if query_key and is_valid_api_key(query_key): return query_key # 两者都无效时,抛出认证失败异常 raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="API密钥无效或未提供", headers={"WWW-Authenticate": "APIKey"} )
3. 在路由中使用认证依赖
将自定义依赖直接加到需要认证的路由参数中即可:
from fastapi import FastAPI app = FastAPI() @app.get("/protected") def protected_resource(valid_api_key: str = Depends(get_valid_api_key)): return {"message": "已通过认证", "使用的密钥": valid_api_key}
逻辑说明
- 优先级严格遵循:Header中的
x-api-key> URL参数中的api_key - 若两者都未提供或验证失败,直接返回401未授权状态码(如需返回403禁止访问,修改
status_code为status.HTTP_403_FORBIDDEN即可) - 验证函数
is_valid_api_key可灵活扩展,比如从环境变量读取合法密钥、查询数据库校验密钥合法性等
内容的提问来源于stack exchange,提问作者Synedraacus
相关产品推荐
相关产品推荐

