feat(frontend+backend): 实现SSR登录态优化与字体自托管

1. 后端调整refresh cookie路径与注释,完善认证cookie处理逻辑
2. 前端全局layout新增next/font自托管字体,消除FOUT闪动
3. 实现SSR直出登录态与未读通知数,避免页面加载闪动
4. 新增中间件处理access token静默轮转,保障SSR登录态
5. 优化登录、改密流程,添加页面刷新同步登录态
6. 重构通知铃铛组件支持初始未读数传入
This commit is contained in:
2026-09-12 04:59:26 +08:00
parent 1eaf3903d4
commit 1bb565c687
9 changed files with 226 additions and 30 deletions

View File

@@ -16,7 +16,8 @@ var (
// setAuthCookies 设置认证 cookie:
// - j13_token: access token(HttpOnly,15min)
// - j13_refresh: refresh token(HttpOnly,7天,仅 /api/auth 路径)
// - j13_refresh: refresh token(HttpOnly,7天,Path=/,供 Next middleware 在
// 页面/RSC 请求中读取并静默轮转;HttpOnly+SameSite=Strict+CSRF 校验已足够防护)
// - j13_csrf: CSRF token(可读,7天,与 refresh 同生命周期,确保 refresh 流程可用)
func setAuthCookies(c *gin.Context, accessToken, refreshToken string, secure bool) {
csrfToken := service.GenerateCSRFToken()
@@ -31,11 +32,12 @@ func setAuthCookies(c *gin.Context, accessToken, refreshToken string, secure boo
Secure: secure,
SameSite: http.SameSiteStrictMode,
})
// Refresh token cookie(仅 /api/auth 路径使用,缩小攻击面)
// Refresh token cookie:Path=/ 以支持 SSR middleware 续期;
// 仅 /api/auth/refresh 端点消费,其他路径不读取
http.SetCookie(c.Writer, &http.Cookie{
Name: service.RefreshCookieName,
Value: refreshToken,
Path: "/api/auth",
Path: "/",
MaxAge: refreshCookieMaxAge,
HttpOnly: true,
Secure: secure,
@@ -55,8 +57,10 @@ func setAuthCookies(c *gin.Context, accessToken, refreshToken string, secure boo
// clearAuthCookies 清除所有认证 cookie
func clearAuthCookies(c *gin.Context) {
// refresh cookie 同时清除两个路径:Path=/api/auth 为旧版兼容
cookies := []struct{ name, path string }{
{service.CookieName, "/"},
{service.RefreshCookieName, "/"},
{service.RefreshCookieName, "/api/auth"},
{service.CSRFCookieName, "/"},
}