import http from './http' import type { LoginRequest, LoginResponse, MeResponse, Scope } from '@/types/auth' import { mockLogin } from '@/mock/server' // 是否走前端 Mock。由 VITE_USE_MOCK 控制: // - .env.development 默认 'true' → 本地无后端即可联调 // - .env.production 默认 'false' → 生产强制走 Platform.Server 真实 API // 任何不等于字符串 'true' 的取值都视为 false,避免 build 时静态替换出错。 const MOCK = import.meta.env.VITE_USE_MOCK === 'true' export async function login(req: LoginRequest): Promise { if (MOCK) return mockLogin(req) const { data } = await http.post('/auth/login', req) return data } export async function logout(): Promise { if (MOCK) return await http.post('/auth/logout') } /** * AR-6 (会话 45):服务端切换 scope 并重发 token + perms。 * 替代过去 stores/auth.ts switchScope 客户端硬编码 allowedOps 的伪权限做法。 * Mock 模式下退化为本地翻转 scope(mockLogin 已经依据 scope 返回不同 perms)。 */ export async function switchScope(scope: Scope): Promise { if (MOCK) { // mock 直接复用 mockLogin 的 perm 推算逻辑,伪造一次「免密码登录」。 return mockLogin({ username: 'mock-user', password: 'mock', scope }) } const { data } = await http.post('/auth/switch-scope', { scope }) return data } /** * 拿当前 token / Cookie 让后端实校一次身份。成功表示 token 仍被服务端接受, * 失败(401)由 http 拦截器统一清 state + 跳 /login。 * * 解决「Platform.Server 随机 secret 重启 → 老 token 失效 → 前端 isAuthed 仍 true 误放行」的窗口。 */ export async function getMe(): Promise { if (MOCK) { // mock 模式下没有 secret 概念,本地 store 里有什么就是什么;直接 throw 让守卫 // 走「认可本地状态」分支,避免 mock 联调误判为「身份失效」。 throw new Error('mock-mode-skip-me-validation') } const { data } = await http.get('/auth/me') return data }