const TOKEN_KEY = 'app_token' const USER_KEY = 'app_user' const TENANT_KEY = 'app_tenant_name' const TID_KEY = 'app_tid' const REFRESH_KEY = 'app_refresh_token' const SID_KEY = 'app_sid' const TENANTS_KEY = 'app_tenants' /** * 是否启用统一认证(UAC)。 * 统一认证是默认形态(与 Web 端 /auth/login 同一套账号体系); * 仅在 .env 中显式配置 VITE_AUTH_MODE=legacy 时才回退旧的「租户名 + 账号」直登。 */ export function isSSOEnabled() { try { const mode = (typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.VITE_AUTH_MODE) || '' return String(mode).toLowerCase() !== 'legacy' } catch (e) { return true } } /** 统一认证:保存令牌与会话信息 */ export function setAuthTokens(data = {}) { if (data.access_token) setToken(data.access_token) if (data.refresh_token) uni.setStorageSync(REFRESH_KEY, data.refresh_token) if (data.sid) uni.setStorageSync(SID_KEY, data.sid) } export function getRefreshToken() { return uni.getStorageSync(REFRESH_KEY) || '' } export function getSid() { return uni.getStorageSync(SID_KEY) || '' } export function setTid(tid) { uni.setStorageSync(TID_KEY, tid || '') } export function getTid() { return Number(uni.getStorageSync(TID_KEY) || 0) } /** 统一认证:缓存「该账号可进入的企业」列表,供登录后展示/切换企业 */ export function setTenants(list) { uni.setStorageSync(TENANTS_KEY, Array.isArray(list) ? list : []) } export function getTenants() { const list = uni.getStorageSync(TENANTS_KEY) return Array.isArray(list) ? list : [] } /** * 取「当前登录的那一家企业」的名称。 * 登录返回的 tenants 是该账号可进入的全部企业,顶部展示必须是当前会话选中的企业。 */ export function resolveTenantName(info = {}, tid = 0) { if (info && info.tenant_name) return info.tenant_name const list = (info && info.tenants) || getTenants() const hit = list.find((t) => String(t.tid) === String(info.tid || tid)) if (hit) return hit.tenant_name || '' return list.length ? list[0].tenant_name || '' : '' } const REMEMBER_KEY = 'app_remember_me' const REMEMBER_TENANT_KEY = 'app_remember_tenant' const REMEMBER_ACCOUNT_KEY = 'app_remember_account' const REMEMBER_PASSWORD_KEY = 'app_remember_password' export function setToken(token) { uni.setStorageSync(TOKEN_KEY, token || '') } export function getToken() { return uni.getStorageSync(TOKEN_KEY) || '' } export function setUser(user) { uni.setStorageSync(USER_KEY, user || null) } export function getUser() { return uni.getStorageSync(USER_KEY) || null } export function setTenantName(name) { uni.setStorageSync(TENANT_KEY, name || '') } export function getTenantName() { return uni.getStorageSync(TENANT_KEY) || '' } export function isLoggedIn() { return !!getToken() } export function logout() { uni.removeStorageSync(TOKEN_KEY) uni.removeStorageSync(USER_KEY) uni.removeStorageSync(REFRESH_KEY) uni.removeStorageSync(SID_KEY) uni.removeStorageSync(TID_KEY) uni.removeStorageSync(TENANTS_KEY) } /** * 清除「待选企业」阶段的临时登录态。 * 一人多企业时 /auth/login 先签发一枚 tid=0、有效期 10 分钟的待选令牌, * 用户若放弃选择或切换账号,必须清掉,避免半登录态残留去访问业务接口。 */ export function clearPendingAuth() { uni.removeStorageSync(TOKEN_KEY) uni.removeStorageSync(REFRESH_KEY) uni.removeStorageSync(SID_KEY) uni.removeStorageSync(TID_KEY) uni.removeStorageSync(TENANTS_KEY) } /** 是否开启记住账号登录信息 */ export function isRememberLogin() { return uni.getStorageSync(REMEMBER_KEY) === '1' } /** * 读取记住的账号登录信息。 * 安全说明:不再保存/回填密码,仅记住租户名与账号。 */ export function getRememberLogin() { if (!isRememberLogin()) { return { rememberMe: false, tenantName: '', account: '' } } return { rememberMe: true, tenantName: uni.getStorageSync(REMEMBER_TENANT_KEY) || '', account: uni.getStorageSync(REMEMBER_ACCOUNT_KEY) || '' } } /** 保存账号登录信息(租户、账号;不含密码) */ export function saveRememberLogin({ tenantName = '', account = '' } = {}) { uni.setStorageSync(REMEMBER_KEY, '1') uni.setStorageSync(REMEMBER_TENANT_KEY, tenantName) uni.setStorageSync(REMEMBER_ACCOUNT_KEY, account) // 历史版本可能已落盘明文密码,这里一并清理 uni.removeStorageSync(REMEMBER_PASSWORD_KEY) } /** 清除记住的账号登录信息 */ export function clearRememberLogin() { uni.removeStorageSync(REMEMBER_KEY) uni.removeStorageSync(REMEMBER_TENANT_KEY) uni.removeStorageSync(REMEMBER_ACCOUNT_KEY) uni.removeStorageSync(REMEMBER_PASSWORD_KEY) } /** * 登录成功写入 token 与用户信息 * @param {{ token?: string, user?: object, nickname?: string, phone?: string, account?: string, name?: string, avatar?: string, id?: number|string }} payload */ export function loginSuccess(payload = {}) { const token = payload.token || payload.access_token || '' if (token) { setToken(token) } const rawUser = payload.user || payload const user = { id: rawUser.id, account: rawUser.account || '', name: rawUser.name || '', nickname: rawUser.nickname || rawUser.name || rawUser.account || '云泽用户', avatar: rawUser.avatar || '', phone: rawUser.phone || payload.phone || '', tid: rawUser.tid, rid: rawUser.rid, role_name: rawUser.role_name || '', ...rawUser } // 保证 nickname 可用 if (!user.nickname) { user.nickname = user.name || user.account || '云泽用户' } setUser(user) return user }