fix recommend runtime auth isolation

This commit is contained in:
2026-05-09 16:08:40 +08:00
parent 9ca66715a4
commit 80a4183b45
14 changed files with 292 additions and 25 deletions

View File

@@ -34,6 +34,8 @@ export type ApiRequestOptions = {
skipRefresh?: boolean;
// 会话探测类请求需要静默处理 401避免 AuthGate 因自发广播再次触发 hydrate。
notifyAuthStateChange?: boolean;
// 推荐页自动加载作品这类局部后台请求失败时,只应让当前卡片报错,不应清空全局登录态。
clearAuthOnUnauthorized?: boolean;
};
type ResolvedRetryOptions = {
@@ -525,6 +527,8 @@ export async function fetchWithApiAuth(
const method = (init.method ?? 'GET').toUpperCase();
const retry = resolveRetryOptions(method, options.retry);
const shouldNotifyAuthStateChange = options.notifyAuthStateChange !== false;
const shouldClearAuthOnUnauthorized =
options.clearAuthOnUnauthorized !== false;
const requestSignal = init.signal ?? undefined;
let attempt = 0;
let refreshAttempted = false;
@@ -580,7 +584,7 @@ export async function fetchWithApiAuth(
// 否则像 Puzzle works 这类受保护列表会把单接口失败放大成整个平台重复 hydrate。
continue;
} catch {
if (hasAuthHeader) {
if (hasAuthHeader && shouldClearAuthOnUnauthorized) {
clearStoredAccessToken({ emit: false });
}
if (shouldNotifyAuthStateChange) {
@@ -593,7 +597,9 @@ export async function fetchWithApiAuth(
!options.skipAuth &&
!refreshAttempted
) {
clearStoredAccessToken({ emit: false });
if (shouldClearAuthOnUnauthorized) {
clearStoredAccessToken({ emit: false });
}
if (shouldNotifyAuthStateChange) {
emitAuthStateChange();
}