Skip to content
This repository was archived by the owner on Aug 2, 2026. It is now read-only.

Commit 15d2cf9

Browse files
committed
fix(auth): 修复退出登录后无法重新登录
clear_refresh_cookie 用 delete_cookie 时属性(samesite/httponly/secure)与 set 时不匹配,浏览器拒绝删除 cookie,导致 /auth/me 仍识别为已登录,login 页把用户弹回 dashboard。 改用 set_cookie(max_age=0, expires=0) 显式带上与 set 一致的 httponly/secure/samesite 属性,确保 cookie 真正被删除。 额外加前端防抖兜底:profile 退出时设 sessionStorage just_logged_out 标记,login 页看到标记跳过 /auth/me 探测,避免 cookie 删除时序问题导致误判。
1 parent d752907 commit 15d2cf9

3 files changed

Lines changed: 26 additions & 2 deletions

File tree

‎app/security/refresh_token.py‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,23 @@ def set_refresh_cookie(response, token: str) -> None:
7272

7373

7474
def clear_refresh_cookie(response) -> None:
75-
"""清除 Refresh Token Cookie(同时清除新旧路径)。"""
76-
response.delete_cookie(
75+
"""清除 Refresh Token Cookie(同时清除新旧路径)。
76+
77+
注意:delete_cookie 必须带上与 set_cookie 一致的 secure/samesite/httponly 属性,
78+
否则浏览器会因属性不匹配而拒绝删除(Starlette delete_cookie 默认 samesite=lax、secure=False)。
79+
"""
80+
# path=/ 的 cookie(当前主路径)
81+
response.set_cookie(
7782
key=settings.refresh_token_cookie_name,
83+
value="",
84+
max_age=0,
85+
expires=0,
7886
path="/",
87+
httponly=True,
88+
secure=settings.is_prod,
89+
samesite="strict",
7990
)
91+
# path=/auth 的旧 cookie(兼容历史路径,属性不要求精确)
8092
response.delete_cookie(
8193
key=settings.refresh_token_cookie_name,
8294
path="/auth",

‎app/templates/pages/login.html‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,16 @@
293293

294294
// 已登录用户访问 /login 时自动跳到后台(避免登录态用户重复看到登录表单)
295295
// 用 /auth/me 探测:优先带内存 access_token,失败回退到 refresh cookie 校验
296+
// 跳过条件:sessionStorage 有 just_logged_out 标记(刚从 /profile 退出登录),
297+
// 避免 cookie 删除时序问题导致误判为已登录又弹回 dashboard
296298
(function() {
299+
var justLoggedOut = false;
300+
try {
301+
justLoggedOut = sessionStorage.getItem('just_logged_out') === '1';
302+
if (justLoggedOut) sessionStorage.removeItem('just_logged_out');
303+
} catch (e) {}
304+
if (justLoggedOut) return;
305+
297306
var next = new URLSearchParams(location.search).get('next');
298307
var headers = {};
299308
if (window.__ACCESS_TOKEN__) {

‎app/templates/pages/profile.html‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@
170170
console.error('logout request failed', e);
171171
}
172172
window.__ACCESS_TOKEN__ = null;
173+
// 标记刚退出登录,login 页看到此标记会跳过「已登录自动跳转」探测,
174+
// 避免 cookie 删除时序问题导致 login 页误判为已登录又弹回 dashboard
175+
try { sessionStorage.setItem('just_logged_out', '1'); } catch (e) {}
173176
location.href = '/login';
174177
}
175178
</script>

0 commit comments

Comments
 (0)