FastAPI已在文档认证仍提示“Not authenticated”问题排查与解决
问题原因
- Swagger文档(/docs页面)完成认证后,会自动把获取到的access_token以
Bearer <token>的格式添加到后续请求的Authorization请求头中,接口通过OAuth2PasswordBearer能正确识别认证信息,因此可以正常调用。 - 直接在浏览器地址栏访问时,浏览器发起的GET请求不会携带任何Authorization认证头,而
OAuth2PasswordBearer的核心逻辑就是检查请求头中的该字段,找不到合法认证信息就会返回"Not authenticated"错误。
解决方法
临时测试方案
- 手动添加请求头:打开浏览器开发者工具(F12),切换到Network标签页,重新发起请求后找到该请求,修改请求头添加
Authorization: Bearer someToken(其中someToken是你从/token接口获取到的令牌),刷新后即可正常访问。 - 使用带认证的请求命令:用curl发起请求,命令如下:
curl -H "Authorization: Bearer someToken" http://127.0.0.1:8000/
- 通过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
相关产品推荐
相关产品推荐

