Merge remote-tracking branch 'origin/huangzhenbao-admin'
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { AkReqUploadOptions, AkReqOptions, AkReqResponse, AkReqError } from './interface.uts';
|
||||
import { AkReqUploadOptions, AkReqOptions, AkReqResponse, AkReqError } from './interface.uts';
|
||||
import { SUPA_URL } from '@/ak/config.uts';
|
||||
|
||||
// token 持久化 key
|
||||
@@ -7,6 +7,29 @@ const REFRESH_TOKEN_KEY = 'akreq_refresh_token';
|
||||
const EXPIRES_AT_KEY = 'akreq_expires_at';
|
||||
|
||||
// 优化:用静态变量缓存 token,只有 set/clear 时同步 storage
|
||||
|
||||
// Web 端(H5)由于多账号联调需要,开启单 Tab 隔离的储流(sessionStorage)
|
||||
function setAuthStore(key : string, value : any) {
|
||||
// #ifdef H5
|
||||
sessionStorage.setItem(key, String(value));
|
||||
return;
|
||||
// #endif
|
||||
uni.setStorageSync(key, value);
|
||||
}
|
||||
function getAuthStore(key : string) : any | null {
|
||||
// #ifdef H5
|
||||
return sessionStorage.getItem(key);
|
||||
// #endif
|
||||
return uni.getStorageSync(key);
|
||||
}
|
||||
function removeAuthStore(key : string) {
|
||||
// #ifdef H5
|
||||
sessionStorage.removeItem(key);
|
||||
return;
|
||||
// #endif
|
||||
uni.removeStorageSync(key);
|
||||
}
|
||||
|
||||
let _accessToken : string | null = null;
|
||||
let _refreshToken : string | null = null;
|
||||
let _expiresAt : number | null = null;
|
||||
@@ -16,25 +39,25 @@ export class AkReq {
|
||||
_accessToken = token;
|
||||
_refreshToken = refreshToken;
|
||||
_expiresAt = expiresAt;
|
||||
uni.setStorageSync(ACCESS_TOKEN_KEY, token);
|
||||
uni.setStorageSync(REFRESH_TOKEN_KEY, refreshToken);
|
||||
uni.setStorageSync(EXPIRES_AT_KEY, expiresAt);
|
||||
setAuthStore(ACCESS_TOKEN_KEY, token);
|
||||
setAuthStore(REFRESH_TOKEN_KEY, refreshToken);
|
||||
setAuthStore(EXPIRES_AT_KEY, expiresAt);
|
||||
}
|
||||
static getToken() : string | null {
|
||||
if (_accessToken != null) return _accessToken;
|
||||
const t = uni.getStorageSync(ACCESS_TOKEN_KEY) as string | null;
|
||||
const t = getAuthStore(ACCESS_TOKEN_KEY) as string | null;
|
||||
_accessToken = t;
|
||||
return t;
|
||||
}
|
||||
static getRefreshToken() : string | null {
|
||||
if (_refreshToken != null) return _refreshToken;
|
||||
const t = uni.getStorageSync(REFRESH_TOKEN_KEY) as string | null;
|
||||
const t = getAuthStore(REFRESH_TOKEN_KEY) as string | null;
|
||||
_refreshToken = t;
|
||||
return t;
|
||||
} static getExpiresAt() : number | null {
|
||||
const val = _expiresAt;
|
||||
if (val != null) return val;
|
||||
const t = uni.getStorageSync(EXPIRES_AT_KEY) as number | null;
|
||||
const t = getAuthStore(EXPIRES_AT_KEY) as number | null;
|
||||
_expiresAt = t;
|
||||
return t;
|
||||
}
|
||||
@@ -42,9 +65,9 @@ export class AkReq {
|
||||
_accessToken = null;
|
||||
_refreshToken = null;
|
||||
_expiresAt = null;
|
||||
uni.removeStorageSync(ACCESS_TOKEN_KEY);
|
||||
uni.removeStorageSync(REFRESH_TOKEN_KEY);
|
||||
uni.removeStorageSync(EXPIRES_AT_KEY);
|
||||
removeAuthStore(ACCESS_TOKEN_KEY);
|
||||
removeAuthStore(REFRESH_TOKEN_KEY);
|
||||
removeAuthStore(EXPIRES_AT_KEY);
|
||||
} // 判断 token 是否即将过期(提前5分钟刷新)
|
||||
static isTokenExpiring() : boolean {
|
||||
const expiresAt = this.getExpiresAt();
|
||||
@@ -94,10 +117,7 @@ export class AkReq {
|
||||
if (accessToken !== null && refreshTokenNew !== null && expiresAt !== null) {
|
||||
this.setToken(accessToken, refreshTokenNew, expiresAt);
|
||||
return true;
|
||||
} else {
|
||||
this.clearToken();
|
||||
return false;
|
||||
}
|
||||
} else { this.clearToken(); uni.$emit('AUTH_SESSION_EXPIRED', { reason: 'refresh_failed' }); return false; }
|
||||
} catch (e) {
|
||||
this.clearToken();
|
||||
return false;
|
||||
@@ -118,7 +138,8 @@ export class AkReq {
|
||||
// 统一 header,自动带上 Authorization/Content-Type/Accept
|
||||
let headers = options.headers ?? ({} as UTSJSONObject);
|
||||
const token = this.getToken();
|
||||
if (token != null && token != "") {
|
||||
const existAuth = headers['Authorization'] ?? headers['authorization'];
|
||||
if ((token != null && token != "") && (existAuth == null)) {
|
||||
headers = Object.assign({}, headers, { Authorization: `Bearer ${token}` }) as UTSJSONObject;
|
||||
}
|
||||
let contentType = options.contentType ?? '';
|
||||
@@ -246,6 +267,8 @@ export class AkReq {
|
||||
// 全局处理 401 未授权:在非 refresh 场景下,清理 token。
|
||||
// 测试模式下不强制跳登录页,避免影响任意跳转调试。
|
||||
if ((finalRes.status === 401) && (skipRefresh !== true)) {
|
||||
uni.$emit('AUTH_SESSION_EXPIRED', { reason: '401' });
|
||||
|
||||
try {
|
||||
this.clearToken();
|
||||
uni.showToast({ title: '未授权或登录已过期,请重新登录', icon: 'none' });
|
||||
|
||||
Reference in New Issue
Block a user