FastAPI使用Authorization: Token请求头报错及不发送问题求助
问题根源拆解
第一个代码报错原因:
HTTP 请求头的名称不能包含冒号(:),你把 Header 的alias设置为"Authorization: Token",违反了 HTTP 头格式规范,直接导致"authorization: token is an invalid header name"错误。冒号是用来分隔头名称和头值的,正确格式应为Authorization: Token <your-token>——其中Authorization是头名,Token <your-token>是头值。第二个代码的问题:
- 接收请求头时,仅指定
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
相关产品推荐
相关产品推荐

