From 2c01b0f9107efb21805f550bcc30ee37b497e97c Mon Sep 17 00:00:00 2001 From: MikiVL Date: Tue, 5 May 2026 05:59:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=89=8D=E7=AB=AF=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=BA=93=EF=BC=88login/register/activate/token=20=E7=AE=A1?= =?UTF-8?q?=E7=90=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/auth.ts | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/lib/auth.ts diff --git a/src/lib/auth.ts b/src/lib/auth.ts new file mode 100644 index 0000000..05df057 --- /dev/null +++ b/src/lib/auth.ts @@ -0,0 +1,62 @@ +const TOKEN_KEY = 'mikivl_token' +const API = '/api' + +export type CurrentUser = { id: string; username: string; cloudEnabled: boolean } + +export function getToken(): string | null { + return localStorage.getItem(TOKEN_KEY) +} + +export function setToken(token: string) { + localStorage.setItem(TOKEN_KEY, token) +} + +export function clearToken() { + localStorage.removeItem(TOKEN_KEY) +} + +export function authHeaders(): Record { + const token = getToken() + return token ? { Authorization: `Bearer ${token}` } : {} +} + +export async function apiRegister(username: string, password: string): Promise<{ token: string; user: CurrentUser }> { + const res = await fetch(`${API}/auth/register`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password }), + }) + const data = await res.json() + if (!res.ok) throw new Error(data.error ?? '注册失败') + return data +} + +export async function apiLogin(username: string, password: string): Promise<{ token: string; user: CurrentUser }> { + const res = await fetch(`${API}/auth/login`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password }), + }) + const data = await res.json() + if (!res.ok) throw new Error(data.error ?? '登录失败') + return data +} + +export async function apiActivate(code: string): Promise { + const res = await fetch(`${API}/auth/activate`, { + method: 'POST', + headers: { 'Content-Type': 'application/json', ...authHeaders() }, + body: JSON.stringify({ code }), + }) + const data = await res.json() + if (!res.ok) throw new Error(data.error ?? '激活失败') +} + +export function parseToken(token: string): CurrentUser | null { + try { + const payload = JSON.parse(atob(token.split('.')[1])) + return { id: payload.userId, username: payload.username, cloudEnabled: false } + } catch { + return null + } +}