You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:47:05