From 310be913ef36e2a493f0cf4949d3a5d493f83d50 Mon Sep 17 00:00:00 2001 From: Vaica <94612053+zqlit@users.noreply.github.com> Date: Mon, 22 Jun 2026 15:55:09 +0800 Subject: [PATCH] 1555 --- write-server/nginx/sw.js | 19 +++++++++++++------ write-server/src/lib/fetch.ts | 9 +++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 write-server/src/lib/fetch.ts diff --git a/write-server/nginx/sw.js b/write-server/nginx/sw.js index cba82dc9..8476e58c 100644 --- a/write-server/nginx/sw.js +++ b/write-server/nginx/sw.js @@ -9,9 +9,8 @@ self.addEventListener('fetch', e => { const req = e.request; const url = new URL(req.url); - // 登录页、静态资源、API 请求不拦截 + // 登录页、静态资源不拦截 if (url.pathname === '/login' || url.pathname.startsWith('/_next/') || - url.pathname.startsWith('/api/') || url.pathname.endsWith('.js') || url.pathname.endsWith('.css') || url.pathname.endsWith('.ico') || url.pathname.endsWith('.woff2')) { e.respondWith(fetch(req)); @@ -21,18 +20,26 @@ self.addEventListener('fetch', e => { e.respondWith((async () => { const token = self.__auth_token; const tokenTime = self.__auth_time || 0; + const isApi = url.pathname.startsWith('/api/'); + // 无 token 且不是 API 请求 → 跳转登录 if (!token || (Date.now() - tokenTime > EXPIRE_MS)) { - self.__auth_token = null; - self.__auth_time = 0; - return Response.redirect(LOGIN, 302); + if (!isApi) { + self.__auth_token = null; + self.__auth_time = 0; + return Response.redirect(LOGIN, 302); + } + // API 请求无 token,直接发(让 API 自己返回 401) + return fetch(req); } + // 添加认证头 const headers = new Headers(req.headers); headers.set('X-Auth-User', token); const res = await fetch(new Request(req, { headers })); - if (res.status === 401) { + // 非 API 请求 401 → 跳转登录 + if (res.status === 401 && !isApi) { self.__auth_token = null; self.__auth_time = 0; return Response.redirect(LOGIN, 302); diff --git a/write-server/src/lib/fetch.ts b/write-server/src/lib/fetch.ts new file mode 100644 index 00000000..35a42122 --- /dev/null +++ b/write-server/src/lib/fetch.ts @@ -0,0 +1,9 @@ +// 带认证的 fetch 封装 +export async function authFetch(url: string, options: RequestInit = {}): Promise { + const token = localStorage.getItem("wauth_token"); + const headers = new Headers(options.headers); + if (token) { + headers.set("X-Auth-User", token); + } + return fetch(url, { ...options, headers }); +}