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属性。 - 自定义装饰器方案失败:
- 你没有处理异步路由函数,装饰器内没有
await被装饰的异步函数,直接返回协程对象会触发不可迭代错误。 - FastAPI的
Request对象不支持字典式赋值,所有自定义存储的内容必须放到预留的request.state属性下。
- 你没有处理异步路由函数,装饰器内没有
内容的提问来源于stack exchange,提问作者Ghasem
相关产品推荐
相关产品推荐

