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

FastAPI搭建API网关时注入自定义token报错的解决方案咨询

可行实现方案

核心思路是使用FastAPI原生的依赖系统,依赖的执行顺序在鉴权逻辑之后,刚好可以拿到已经注入的用户信息,同时符合FastAPI的设计规范。

步骤1:自定义token注入依赖

你之前配置的fastapi-azure-auth鉴权本身就是FastAPI依赖项,我们可以新建一个依赖,放在鉴权依赖之后执行:

from fastapi import Depends, Request
# 导入你原有配置的Azure AD鉴权依赖对象,示例如下,替换为你实际的实例名
from your_config import azure_scheme, User

async def add_custom_token(request: Request, user: User = Depends(azure_scheme)):
    # 此时user已完成鉴权,等价于request.state.user
    new_token = generate_token(user)
    # 自定义数据统一存到request.state下,避免赋值错误
    request.state.new_token = new_token

步骤2:注册依赖

如果需要所有路由都生效,直接注册为全局依赖:

from fastapi import FastAPI

app = FastAPI(
    # 原有其他配置
    dependencies=[Depends(add_custom_token)]
)

如果只需要部分路由使用,单独给对应路由添加依赖即可:

@app.get("/proxy/downstream-service1")
async def proxy_route(request: Request, _: None = Depends(add_custom_token)):
    # 转发请求到下游时直接从state取自定义token
    headers = request.headers.mutablecopy()
    headers["Authorization"] = f"Bearer {request.state.new_token}"
    # 执行转发逻辑即可

原方案报错原因说明

  • 中间件方案失败:FastAPI的HTTP中间件执行顺序早于所有依赖解析逻辑,fastapi-azure-auth的鉴权依赖还未执行,自然没有request.state.user属性。
  • 自定义装饰器方案失败:
    1. 你没有处理异步路由函数,装饰器内没有await被装饰的异步函数,直接返回协程对象会触发不可迭代错误。
    2. FastAPI的Request对象不支持字典式赋值,所有自定义存储的内容必须放到预留的request.state属性下。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:24:03