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

FastAPI问题:无法从中间件的Request对象获取认证令牌

请求令牌验证的错误分析与修复

核心问题

你完全搞混了请求头和响应头的作用:

  • 客户端发请求时携带的Authorization(你说的auth头)存在request.headers里,这是服务器要读取的请求信息
  • response.headers是服务器准备返回给客户端的响应信息,默认根本不会包含请求里的令牌,所以你从这里读取肯定会触发KeyError

另外你的中间件逻辑顺序也错了:应该先验证请求里的令牌,再让请求继续往下处理,而不是等请求处理完返回响应了才去做验证。

修正后的代码

@app.middleware("http")
async def validate_access_token(request: Request, call_next):
    # 从请求头获取Authorization令牌
    auth_header = request.headers.get("Authorization")
    if not auth_header or not auth_header.startswith("Bearer "):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED, 
            detail='缺少或无效的Authorization请求头'
        )
    
    access_token = auth_header.split()[1]
    try:
        # 验证令牌签名
        jwt.decode(access_token, key=SECRET, algorithms=[CRYPT_ALGO])
    except jwt.InvalidTokenError:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED, 
            detail='无效的访问令牌'
        )
    
    # 令牌验证通过,继续处理请求
    response = await call_next(request)
    return response

关键细节说明

  • 验证逻辑必须放在call_next(request)之前:这样能在处理业务请求前就拦截无效令牌,避免浪费服务器资源
  • 用request.headers.get()替代直接索引:既可以避免键不存在时的KeyError,还能提前校验令牌的格式是否符合Bearer规范
  • 捕获jwt.InvalidTokenError:JWT签名无效、令牌过期、格式错误等情况都会抛出这个异常,统一捕获处理更严谨

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:21:12