All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- AuthProvider 管理 jumpToken 交换和 JWT 生命周期 - 未授权页面(ShieldX 图标 + 提示文字) - 加载中旋转动画 - fetchJson 全局客户端自动附加 Authorization header - 401 响应触发重新认证 - JWT 存 sessionStorage,刷新不丢失 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
25 lines
686 B
TypeScript
25 lines
686 B
TypeScript
/** 全局认证 fetch 客户端 */
|
|
|
|
let tokenGetter: () => string | null = () => null;
|
|
|
|
export function setTokenGetter(fn: () => string | null) {
|
|
tokenGetter = fn;
|
|
}
|
|
|
|
export async function fetchJson<T>(url: string, options?: RequestInit): Promise<T> {
|
|
const token = tokenGetter();
|
|
const res = await fetch(url, {
|
|
...options,
|
|
headers: {
|
|
...options?.headers,
|
|
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
},
|
|
});
|
|
if (res.status === 401) {
|
|
window.dispatchEvent(new CustomEvent('auth:unauthorized'));
|
|
throw new Error('Unauthorized');
|
|
}
|
|
if (!res.ok) throw new Error(`API error: ${res.status} ${res.statusText}`);
|
|
return res.json();
|
|
}
|