190 lines
5.5 KiB
JavaScript
190 lines
5.5 KiB
JavaScript
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
|
|
}
|