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

FastAPI使用Authorization: Token请求头报错及不发送问题求助

FastAPI 中 Authorization: Token 头的正确实现方式

问题根源拆解

  1. 第一个代码报错原因:
    HTTP 请求头的名称不能包含冒号(:),你把 Header 的 alias 设置为 "Authorization: Token",违反了 HTTP 头格式规范,直接导致"authorization: token is an invalid header name"错误。冒号是用来分隔头名称和头值的,正确格式应为 Authorization: Token <your-token>——其中Authorization是头名,Token <your-token>是头值。

  2. 第二个代码的问题:

    • 接收请求头时,仅指定alias="Authorization"但未处理头值里的Token 前缀,导致拿到的token变量是完整的Token xxx字符串而非纯token;
    • 返回响应头时,错误地把"Authorization: Token "+...作为头名称,正确做法是头名为Authorization,头值为Token <your-token>;
    • 所谓"请求头完全不发送",大概率是客户端请求时未正确携带Authorization: Token <token>头,或你在接口文档(Swagger UI)里未按格式填写。

修正后的完整代码

1. 基础版:直接处理请求头

from fastapi import Header, Response, APIRouter
from typing import Union, List
import json
import config  # 假设你的config模块已定义

router = APIRouter()

@router.get('/versions', tags=["Credentials"], responses={
    200: {
        "model": List[models.versions_info],
        "description": "Return version list",
        "headers": {"Authorization": {"description": "Token format: 'Token <your-token>'", "type": "string"}}
    }
})
async def list_versions(authorization: Union[str, None] = Header(alias="Authorization", default=None)):
    # 提取纯token:去掉头值开头的"Token "前缀
    token = None
    if authorization and authorization.startswith("Token "):
        token = authorization[6:].strip()
    
    # 可选:添加token有效性验证
    if not token:
        return Response(
            status_code=401,
            content=json.dumps({"error": "Missing or invalid token"}),
            media_type="application/json"
        )
    
    # 构造返回数据
    out = [
        {"version": "2.1.1", "url": "https://www.server.com/ocpi/2.1.1/"},
        {"version": "2.2", "url": "https://www.server.com/ocpi/2.2/"}
    ]
    
    # 正确设置响应头:头名为Authorization,值为"Token <your-token>"
    response_headers = {"Authorization": f"Token {config.globals['mytoken']}"}
    return Response(
        status_code=200,
        content=json.dumps(out),
        media_type="application/json",
        headers=response_headers
    )

2. 进阶版:用依赖项封装token验证(复用性更强)

如果多个接口都需要token验证,建议把提取逻辑封装为依赖项:

from fastapi import Depends, HTTPException

async def get_valid_token(authorization: Union[str, None] = Header(alias="Authorization", default=None)):
    if not authorization or not authorization.startswith("Token "):
        raise HTTPException(
            status_code=401,
            detail="Invalid or missing Authorization header (required format: Token <your-token>)"
        )
    return authorization[6:].strip()

# 接口中直接使用依赖项
@router.get('/versions', tags=["Credentials"], responses={
    200: {
        "model": List[models.versions_info],
        "description": "Return version list",
        "headers": {"Authorization": {"description": "Token format: 'Token <your-token>'", "type": "string"}}
    }
})
async def list_versions(token: str = Depends(get_valid_token)):
    # token已处理为纯字符串,可直接用于业务验证
    # ... 业务逻辑代码 ...
    
    out = [
        {"version": "2.1.1", "url": "https://www.server.com/ocpi/2.1.1/"},
        {"version": "2.2", "url": "https://www.server.com/ocpi/2.2/"}
    ]
    
    response_headers = {"Authorization": f"Token {config.globals['mytoken']}"}
    return Response(
        status_code=200,
        content=json.dumps(out),
        media_type="application/json",
        headers=response_headers
    )

测试注意事项

  • 客户端请求时,必须携带头:Authorization: Token <your-token-string>;
  • 在FastAPI自动生成的Swagger UI(/docs)测试时,需在"Authorize"弹窗中填写Token <your-token>格式的值,或直接在请求头区域手动添加Authorization头并填入对应内容。

内容的提问来源于stack exchange,提问作者Pavel Gribov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:15:36