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

FastAPI已在文档认证仍提示“Not authenticated”问题排查与解决

问题原因
  • Swagger文档(/docs页面)完成认证后,会自动把获取到的access_token以Bearer <token>的格式添加到后续请求的Authorization请求头中,接口通过OAuth2PasswordBearer能正确识别认证信息,因此可以正常调用。
  • 直接在浏览器地址栏访问时,浏览器发起的GET请求不会携带任何Authorization认证头,而OAuth2PasswordBearer的核心逻辑就是检查请求头中的该字段,找不到合法认证信息就会返回"Not authenticated"错误。
解决方法

临时测试方案

  1. 手动添加请求头:打开浏览器开发者工具(F12),切换到Network标签页,重新发起请求后找到该请求,修改请求头添加Authorization: Bearer someToken(其中someToken是你从/token接口获取到的令牌),刷新后即可正常访问。
  2. 使用带认证的请求命令:用curl发起请求,命令如下:
curl -H "Authorization: Bearer someToken" http://127.0.0.1:8000/
  1. 通过URL参数传递token(不推荐生产环境):修改OAuth2PasswordBearer的配置,允许从查询参数获取token,修改后的代码如下:
from fastapi import FastAPI, Depends, Request
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm

app = FastAPI()

oauth_scheme = OAuth2PasswordBearer(tokenUrl="token", auto_error=False)

@app.get('/')
async def root(token: str | None = Depends(oauth_scheme), request: Request = Depends()):
    if not token:
        # 从查询参数中尝试获取token
        token = request.query_params.get("token")
        if not token:
            return {"detail": "Not authenticated"}
    return {'data': 'someData'}

之后可通过http://127.0.0.1:8000/?token=someToken访问,但这种方式会把token暴露在URL中,存在安全风险,仅适合本地测试。

生产环境方案

如果是前端项目调用接口,需要在前端登录获取token后,将token存储在安全位置(比如sessionStorage),然后在每次发起请求时,自动在请求头中添加Authorization: Bearer <token>字段,确保后端能识别到认证信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:52:50