Files
medical-mall/layouts/admin/utils/adminAuth.uts

82 lines
2.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { state, getCurrentUser } from '@/utils/store.uts'
import { clearAdminRoleCache, refreshAdminRole } from './role.uts'
import supa, { supaReady } from '@/components/supadb/aksupainstance.uts'
let __isHandlingExpired = false
/**
* 统一“登录过期”闭环处理
* - 防止重复弹窗
* - 清理所有认证、用户相关缓存
* - 重置状态树
* - 统一跳转回登录页
*/
export function handleSessionExpired(reason?: string) {
if (__isHandlingExpired) return
__isHandlingExpired = true
console.warn('[AdminAuth] 执行会话过期统一闭环:', reason ?? '未知原因')
// 1. 弹出提示 (确保只弹一次)
uni.showToast({
title: '登录已过期,请重新登录',
icon: 'none',
duration: 2000
})
// 2. 清除本地相关存储
try {
supa.signOut()
} catch(e){}
clearAdminRoleCache()
// 3. 重置全局业务状态树,防止其他组件看到旧内存残影
state.isLoggedIn = false
state.authUser = null
state.userProfile = { username: '', email: '' }
// 4. 跳转登录页
setTimeout(() => {
uni.reLaunch({
url: '/pages/user/login'
})
setTimeout(() => { __isHandlingExpired = false }, 1000)
}, 1000)
}
/**
* 统一的后台启动恢复授权流程
* 返回是否恢复/保持有效的登录态
*/
export async function ensureAdminSession(): Promise<boolean> {
try {
// ① 等待 hydrateSessionFromStorage() 完成从storage恢复token→异步网络请求
// 必须在 getSession() 之前 await否则刷新后 this.session 仍为 null
// 会被误判为未登录并触发 handleSessionExpired。
try { await supaReady } catch (_) {}
const sessionInfo = supa.getSession()
if (sessionInfo.session == null) {
console.warn('[AdminAuth] 没有发现凭证,要求重新登录')
handleSessionExpired('No credentials found')
return false
}
// 主动检查并补齐
const role = await refreshAdminRole()
if (role === 'unknown' || (state.userProfile != null && state.userProfile!.id == null)) {
// 等等,如果是断网状态呢?其实 store 里已经用 status <= 0 判断过断网了。
// 上一步在 store/getCurrentUser 时,如果返回 401 才会真正导致清空。
console.warn('[AdminAuth] Session被认为无效或用户确权失败')
handleSessionExpired('Role verification failed')
return false
}
return true
} catch (e) {
console.error('[AdminAuth] 鉴权启动异常:', e)
handleSessionExpired('Auth exception')
return false
}
}