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

FastAPI认证后Token无法识别问题求助

FastAPI 受保护接口直接访问返回"Not authenticated"的修复方案

一、排查前端请求的Token携带逻辑

直接访问接口返回未认证,最常见的原因是前端请求没有正确携带认证Token。FastAPI默认的OAuth2认证要求Token通过Authorization: Bearer <token>格式的请求头传递。

修复步骤:

  1. 确认登录成功后已将Token存储(比如localStorage)
  2. 访问/protected时,在请求头中添加Authorization字段,示例代码:
const token = localStorage.getItem("access_token");
fetch("/protected", {
  method: "GET",
  headers: {
    "Authorization": `Bearer ${token}`
  }
})
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error(err));

如果是普通HTML表单提交(非AJAX),默认不会携带自定义请求头,需改用AJAX请求,或切换为Cookie存储Token的方案。

二、检查后端认证依赖配置

确保受保护接口正确绑定了认证依赖,且OAuth2配置路径匹配:

1. 确认接口依赖正确应用

# main.py示例
from fastapi import FastAPI, Depends
from auth import get_current_user, User

app = FastAPI()

@app.get("/protected")
async def protected_route(current_user: User = Depends(get_current_user)):
    return {"message": f"Hello, {current_user.username}!"}

2. 验证OAuth2配置的tokenUrl路径

# auth.py示例
from fastapi.security import OAuth2PasswordBearer

# 确保tokenUrl与你的登录接口路径完全一致(比如登录接口是/login就写"login")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")

三、验证Token有效性

若前端已正确携带Token仍报错,检查以下几点:

  • Token是否过期:用JWT解码工具查看exp字段是否在当前时间之后
  • 密钥与算法一致性:后端生成和解析Token用的SECRET_KEY、ALGORITHM必须完全相同
  • Token的sub字段:确认生成Token时sub设置的是合法的用户标识,且get_current_user中正确读取该字段

四、可选:Cookie认证替代方案

如果不想手动维护请求头,可配置后端将Token存入Cookie,前端请求会自动携带:

1. 修改登录接口设置Cookie

# main.py登录接口示例
from fastapi import Response
from auth import create_access_token, ACCESS_TOKEN_EXPIRE_MINUTES
from datetime import timedelta

@app.post("/login")
async def login(response: Response, form_data: OAuth2PasswordRequestForm = Depends()):
    # 省略用户验证逻辑
    access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    access_token = create_access_token(
        data={"sub": form_data.username}, expires_delta=access_token_expires
    )
    # 设置Cookie
    response.set_cookie(
        key="access_token",
        value=f"Bearer {access_token}",
        httponly=True,
        secure=False,  # 生产环境HTTPS下设为True
        samesite="lax"
    )
    return {"access_token": access_token, "token_type": "bearer"}

2. 自定义OAuth2类支持Cookie读取Token

# auth.py修改oauth2_scheme
from fastapi import Request, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

class OAuth2PasswordBearerWithCookie(OAuth2PasswordBearer):
    async def __call__(self, request: Request) -> str | None:
        # 优先从Authorization头获取
        token = await super().__call__(request)
        if not token:
            # 从Cookie读取并去除Bearer前缀
            token = request.cookies.get("access_token")
            if token:
                token = token.replace("Bearer ", "")
        if not token:
            raise HTTPException(
                status_code=status.HTTP_401_UNAUTHORIZED,
                detail="Not authenticated",
                headers={"WWW-Authenticate": "Bearer"},
            )
        return token

oauth2_scheme = OAuth2PasswordBearerWithCookie(tokenUrl="login")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:35:15