@ -177,13 +177,27 @@ async function request<T>(path: string, params?: URLSearchParams): Promise<T> {
|
||||
const fullPath = "/api/v1" + path
|
||||
const { sig, ts, nonce } = await clientSign("GET", fullPath, p.toString())
|
||||
const url = getBase() + fullPath + qs
|
||||
const res = await fetch(url, {
|
||||
headers: {
|
||||
"X-Sign": sig,
|
||||
"X-Sign-Ts": ts,
|
||||
"X-Sign-Nonce": nonce,
|
||||
},
|
||||
})
|
||||
const headers: Record<string, string> = {
|
||||
"X-Sign": sig,
|
||||
"X-Sign-Ts": ts,
|
||||
"X-Sign-Nonce": nonce,
|
||||
}
|
||||
// 已登录则自动附带 Bearer(翻页/筛选等需鉴权的列表请求才能通过后端校验)。
|
||||
// 未登录时不带,首页(page<=1)仍可直接公开访问。
|
||||
const token = getAccessToken()
|
||||
if (token) headers["Authorization"] = `Bearer ${token}`
|
||||
let res = await fetch(url, { headers })
|
||||
// 登录态下 access 过期:用 refresh 续期一次后重试(与 authedFetch 行为一致)。
|
||||
if (res.status === 401 && getRefreshToken()) {
|
||||
try {
|
||||
await refreshSession()
|
||||
const newToken = getAccessToken()
|
||||
if (newToken) headers["Authorization"] = `Bearer ${newToken}`
|
||||
res = await fetch(url, { headers })
|
||||
} catch {
|
||||
/* 刷新失败:保留原 401,下面统一抛出,由调用方处理 */
|
||||
}
|
||||
}
|
||||
if (!res.ok) throw new Error(`API ${res.status} ${url}`)
|
||||
return (await res.json()) as T
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user