Files
zkxw/mobile-h5/utils/auth-session.js
T

122 lines
2.8 KiB
JavaScript
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.
/** 本地登录会话(无网络依赖,供 request / auth 共用,避免循环引用) */
const TOKEN_KEY = 'zkxw_mobile_token'
const REFRESH_TOKEN_KEY = 'zkxw_mobile_refresh_token'
const USER_KEY = 'zkxw_mobile_user'
const RETURN_URL_KEY = 'zkxw_mobile_return_url'
export function setReturnUrl(url) {
try {
uni.setStorageSync(RETURN_URL_KEY, url || '')
} catch (e) {
/* ignore */
}
}
export function takeReturnUrl() {
try {
const u = uni.getStorageSync(RETURN_URL_KEY) || ''
uni.removeStorageSync(RETURN_URL_KEY)
return typeof u === 'string' ? u : ''
} catch (e) {
return ''
}
}
export function getToken() {
try {
return uni.getStorageSync(TOKEN_KEY) || ''
} catch (e) {
return ''
}
}
export function getRefreshToken() {
try {
return uni.getStorageSync(REFRESH_TOKEN_KEY) || ''
} catch (e) {
return ''
}
}
export function isLoggedIn() {
return !!getToken()
}
export function getUser() {
try {
const raw = uni.getStorageSync(USER_KEY)
return raw ? JSON.parse(raw) : null
} catch (e) {
return null
}
}
export function clearSession() {
try {
uni.removeStorageSync(TOKEN_KEY)
uni.removeStorageSync(REFRESH_TOKEN_KEY)
uni.removeStorageSync(USER_KEY)
} catch (e) {
/* ignore */
}
}
export function saveSession({ token, refreshToken, userInfo }) {
uni.setStorageSync(TOKEN_KEY, token || '')
uni.setStorageSync(REFRESH_TOKEN_KEY, refreshToken || '')
uni.setStorageSync(USER_KEY, JSON.stringify(userInfo || null))
}
/** 更新本地缓存的用户信息(保留 token)。 */
export function updateStoredUser(userInfo) {
try {
uni.setStorageSync(USER_KEY, JSON.stringify(userInfo || null))
} catch (e) {
/* ignore */
}
}
let _reloginPending = false
function isOnLoginPage() {
try {
const pages = getCurrentPages()
const cur = pages && pages[pages.length - 1]
const route = (cur && cur.route) || ''
return String(route).indexOf('pages/login') !== -1
} catch (e) {
return false
}
}
/**
* Token 失效:清本地会话并回到登录页(防抖,避免并发 401 连跳)。
* @param {string} [message]
* @param {string} [returnUrl] 登录成功后回跳路径(写入本地,登录页 takeReturnUrl)
*/
export function forceRelogin(message, returnUrl) {
if (_reloginPending) return
if (typeof returnUrl === 'string' && returnUrl.trim()) {
setReturnUrl(returnUrl.trim())
}
clearSession()
if (isOnLoginPage()) return
_reloginPending = true
const title =
(typeof message === 'string' && message.trim()) ||
'登录已失效,请重新登录'
uni.showToast({ title, icon: 'none', duration: 2000 })
setTimeout(() => {
uni.reLaunch({
url: '/pages/login/index',
complete() {
_reloginPending = false
},
fail() {
_reloginPending = false
}
})
}, 400)
}