FastAPI认证后Token无法识别问题求助
FastAPI 受保护接口直接访问返回"Not authenticated"的修复方案
一、排查前端请求的Token携带逻辑
直接访问接口返回未认证,最常见的原因是前端请求没有正确携带认证Token。FastAPI默认的OAuth2认证要求Token通过Authorization: Bearer <token>格式的请求头传递。
修复步骤:
- 确认登录成功后已将Token存储(比如
localStorage) - 访问
/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
相关产品推荐
相关产品推荐

