From debc39bacfbd16253babd6fc12c131bd63b1e223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9B=A6?= <2584059816@qq.com> Date: Sun, 14 Dec 2025 21:27:04 +0800 Subject: [PATCH] =?UTF-8?q?bug:=E4=BF=AE=E5=A4=8D=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86401?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=97=A0=E6=B3=95=E7=99=BB=E5=BD=95=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改 get_ws_token 的行为:当认证缺失或已过期时,返回 HTTP 200 且 success=False,而不是 401。这样可以避免用户停留在登录页面时,前端因收到 401 而不必要地刷新页面。 --- src/webui/ws_auth.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/webui/ws_auth.py b/src/webui/ws_auth.py index d6c4bd33..7d07b5c2 100644 --- a/src/webui/ws_auth.py +++ b/src/webui/ws_auth.py @@ -85,6 +85,8 @@ async def get_ws_token( 此端点验证当前会话的 Cookie 或 Authorization header, 然后返回一个临时 token 用于 WebSocket 握手认证。 临时 token 有效期 60 秒,且只能使用一次。 + + 注意:在未认证时返回 200 状态码但 success=False,避免前端因 401 刷新页面。 """ # 获取当前 session token session_token = None @@ -94,12 +96,17 @@ async def get_ws_token( session_token = authorization.replace("Bearer ", "") if not session_token: - raise HTTPException(status_code=401, detail="未提供认证信息") + # 返回 200 但 success=False,避免前端因 401 刷新页面 + # 这在登录页面是正常情况,不应该触发错误处理 + logger.debug("ws-token 请求:未提供认证信息(可能在登录页面)") + return {"success": False, "message": "未提供认证信息,请先登录", "token": None, "expires_in": 0} # 验证 session token token_manager = get_token_manager() if not token_manager.verify_token(session_token): - raise HTTPException(status_code=401, detail="认证已过期,请重新登录") + # 同样返回 200 但 success=False,避免前端刷新 + logger.debug("ws-token 请求:认证已过期") + return {"success": False, "message": "认证已过期,请重新登录", "token": None, "expires_in": 0} # 生成临时 WebSocket token ws_token = generate_ws_token(session_token)