[优化] 更新认证机制,使用 OPENFLARE_TOKEN 替代 Bearer Token

This commit is contained in:
ryan
2026-06-04 11:10:06 +08:00
parent bdc96f6d8e
commit 6aa71a4da8
38 changed files with 462 additions and 387 deletions
@@ -14,6 +14,7 @@ import {
logout as logoutRequest,
getCurrentUser,
} from '@/features/auth/api/auth';
import { clearStoredOpenFlareToken } from '@/lib/api/auth-token';
import type { AuthUser } from '@/types/auth';
interface AuthContextValue {
@@ -41,6 +42,7 @@ export function AuthProvider({ children }: AuthProviderProps) {
setUserState(nextUser);
return nextUser;
} catch {
clearStoredOpenFlareToken();
setUserState(null);
return null;
} finally {
+31 -3
View File
@@ -1,4 +1,8 @@
import { apiRequest } from '@/lib/api/client';
import {
clearStoredOpenFlareToken,
setStoredOpenFlareToken,
} from '@/lib/api/auth-token';
import type {
AuthUser,
LoginPayload,
@@ -14,11 +18,18 @@ export function login(payload: LoginPayload) {
return apiRequest<AuthUser>('/user/login', {
method: 'POST',
body: JSON.stringify(payload),
}).then((user) => {
if (user.token) {
setStoredOpenFlareToken(user.token);
}
return user;
});
}
export function logout() {
return apiRequest<void>('/user/logout');
return apiRequest<void>('/user/logout').finally(() => {
clearStoredOpenFlareToken();
});
}
export function register(payload: RegisterPayload) {
@@ -48,7 +59,14 @@ export function resetPassword(payload: PasswordResetRequestPayload) {
}
export function exchangeGitHubCode(code: string) {
return apiRequest<AuthUser>(`/oauth/github?code=${encodeURIComponent(code)}`);
return apiRequest<AuthUser>(
`/oauth/github?code=${encodeURIComponent(code)}`,
).then((user) => {
if (user.token) {
setStoredOpenFlareToken(user.token);
}
return user;
});
}
export interface OAuthAuthorizeResult {
@@ -79,12 +97,22 @@ export function exchangeOAuthCode(
const searchParams = new URLSearchParams({ code, state });
return apiRequest<OAuthCallbackResult>(
`/oauth/${encodeURIComponent(String(source))}/callback?${searchParams.toString()}`,
);
).then((result) => {
if (result.user?.token) {
setStoredOpenFlareToken(result.user.token);
}
return result;
});
}
export function linkExistingOAuthAccount(payload: LinkExistingOAuthPayload) {
return apiRequest<OAuthCallbackResult>('/oauth/link-existing', {
method: 'POST',
body: JSON.stringify(payload),
}).then((result) => {
if (result.user?.token) {
setStoredOpenFlareToken(result.user.token);
}
return result;
});
}
@@ -1,4 +1,5 @@
import { apiRequest } from '@/lib/api/client';
import { setStoredOpenFlareToken } from '@/lib/api/auth-token';
import type {
BootstrapTokenPayload,
@@ -109,7 +110,10 @@ export function updateSelf(payload: UpdateSelfPayload) {
}
export function generateAccessToken() {
return apiRequest<string>('/user/token');
return apiRequest<string>('/user/token').then((token) => {
setStoredOpenFlareToken(token);
return token;
});
}
export function bindWeChat(code: string) {
@@ -0,0 +1,22 @@
const openFlareTokenStorageKey = 'openflare_token';
export function getStoredOpenFlareToken() {
if (typeof window === 'undefined') {
return '';
}
return window.localStorage.getItem(openFlareTokenStorageKey) || '';
}
export function setStoredOpenFlareToken(token: string) {
if (typeof window === 'undefined') {
return;
}
window.localStorage.setItem(openFlareTokenStorageKey, token);
}
export function clearStoredOpenFlareToken() {
if (typeof window === 'undefined') {
return;
}
window.localStorage.removeItem(openFlareTokenStorageKey);
}
+7
View File
@@ -1,4 +1,5 @@
import { publicEnv } from '@/lib/env/public-env';
import { getStoredOpenFlareToken } from '@/lib/api/auth-token';
import type { ApiEnvelope } from '@/types/api';
export class ApiError extends Error {
@@ -23,6 +24,12 @@ export async function apiRequest<T>(path: string, init?: RequestInit) {
if (!(init?.body instanceof FormData) && !headers.has('Content-Type')) {
headers.set('Content-Type', 'application/json');
}
if (!headers.has('OPENFLARE_TOKEN')) {
const token = getStoredOpenFlareToken();
if (token) {
headers.set('OPENFLARE_TOKEN', token);
}
}
const response = await fetch(getApiUrl(path), {
credentials: 'include',
+1
View File
@@ -4,6 +4,7 @@ export interface AuthUser {
display_name: string;
role: number;
status: number;
token?: string;
email?: string;
github_id?: string;
wechat_id?: string;