FastAPI在路由文件中实现Basic Auth时认证弹窗不弹出
问题解决:FastAPI Router中HTTP Basic Auth认证弹窗不弹出
问题分析
在Router路由文件中实现HTTP Basic Auth后,访问对应URL时未弹出认证弹窗,直接收到401未认证提示,主要由代码细节、路由挂载或浏览器缓存问题导致。
代码修正与解决方案
- 修复代码瑕疵
你的代码存在冗余导入和缩进错误,修正后代码如下:
from fastapi import Depends, HTTPException, status, APIRouter from fastapi.security import HTTPBasic, HTTPBasicCredentials import secrets security = HTTPBasic() router = APIRouter(prefix="") def get_current_username(credentials: HTTPBasicCredentials = Depends(security)): correct_username = secrets.compare_digest(credentials.username, "user") correct_password = secrets.compare_digest(credentials.password, "password") if not (correct_username and correct_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Basic"}, ) return credentials.username @router.get("/users") async def get_all_users(username: str = Depends(get_current_username)): return username
- 正确挂载Router到主应用
单独的Router文件无法提供服务,必须在主FastAPI应用中引入并挂载该Router。示例主应用文件(如main.py)代码:
from fastapi import FastAPI from your_router_file import router # 替换为你的路由文件名 app = FastAPI() app.include_router(router)
只有完成挂载,路由接口才会被注册,WWW-Authenticate响应头才能触发浏览器认证弹窗。
- 排查浏览器缓存问题
若之前访问过接口并输入错误凭证,浏览器可能缓存了错误信息,导致直接返回401。可尝试:
- 使用隐身/无痕窗口访问
- 清除浏览器缓存与认证信息
- 确认响应头格式
代码中已正确设置headers={"WWW-Authenticate": "Basic"},该头是触发弹窗的关键,确保无拼写错误。
内容的提问来源于stack exchange,提问作者Tushar Rupapara
相关产品推荐
相关产品推荐

