207 lines
6.4 KiB
JavaScript
207 lines
6.4 KiB
JavaScript
import {refreshToken} from '../api/commonApi.js'
|
|
import dayjs from '../uni_modules/uview-ui/libs/util/dayjs.js';
|
|
// 此vm参数为页面的实例,可以通过它引用vuex中的变量
|
|
module.exports = (vm) => {
|
|
// 请求拦截
|
|
uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
|
|
// 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
|
|
config.data = config.data || {}
|
|
// 根据custom参数中配置的是否需要token,添加对应的请求头
|
|
// #ifdef APP-PLUS
|
|
if(
|
|
config.url!==undefined && config.url!==''
|
|
&& config.url.indexOf('logout')==-1
|
|
&& config.url.indexOf('Logout')==-1
|
|
&& config.url.indexOf('login')==-1
|
|
&& config.url.indexOf('Login')==-1
|
|
&& config.url.indexOf('setting')==-1
|
|
&& config.url.indexOf('regionRestrict')==-1
|
|
&& config.url.indexOf('refresh_token')==-1
|
|
&& config.url.indexOf('adfs')==-1
|
|
&& config.url.indexOf('/me')==-1
|
|
&& config.url.indexOf('sys_setting/get_list')==-1
|
|
&& config.url.indexOf('sso/get_sso_token_by_code')==-1
|
|
&& config.url.indexOf('sso/user_sso_login')==-1
|
|
&& config.url.indexOf('sso/mock_user_sso_login')==-1
|
|
&& config.url.indexOf('write_log')==-1
|
|
)
|
|
{
|
|
let siteData = uni.getStorageSync("siteData");
|
|
//模拟内网登录 打包删除
|
|
// siteData.internalTag=true;
|
|
//模拟内网登录 打包删除
|
|
if(siteData!==undefined && siteData!==null && siteData.internalTag===false)
|
|
{
|
|
getApp().checkLocationAndVPN();
|
|
}
|
|
}
|
|
// #endif
|
|
if(config?.custom?.auth) {
|
|
const token = uni.getStorageSync("token")
|
|
const clientId = uni.getStorageSync("clientId")
|
|
config.header.Authorization = token;
|
|
config.header.ClientId = clientId;
|
|
// #ifdef APP-PLUS
|
|
config.header.Origin = config.custom.origin;
|
|
// #endif
|
|
if(config.url.indexOf('refresh_token')==-1 ){
|
|
// checkToken();
|
|
}else{
|
|
config.header.RefreshToken = uni.getStorageSync("refreshToken")
|
|
}
|
|
}
|
|
return config
|
|
}, config => { // 可使用async await 做异步操作
|
|
return Promise.reject(config)
|
|
})
|
|
|
|
// 响应拦截
|
|
uni.$u.http.interceptors.response.use((response) => {
|
|
/* 对响应成功做点什么 可使用async await 做异步操作*/
|
|
const data = response.data
|
|
|
|
// 自定义参数
|
|
// const custom = response.config?.custom
|
|
if (data.code != 0) {
|
|
// 如果没有显式定义custom的toast参数为false的话,默认对报错进行toast弹出提示
|
|
if (data.success==false && data.message) {
|
|
console.log(data.message)
|
|
}
|
|
let url = response.config.url
|
|
let isCheck = (url!==undefined && url!==''
|
|
&& url.indexOf('logout')==-1
|
|
&& url.indexOf('Logout')==-1
|
|
&& url.indexOf('login')==-1
|
|
&& url.indexOf('Login')==-1
|
|
&& url.indexOf('setting')==-1
|
|
&& url.indexOf('regionRestrict')==-1
|
|
&& url.indexOf('refresh_token')==-1
|
|
&& url.indexOf('adfs')==-1
|
|
&& url.indexOf('/me')==-1
|
|
&& url.indexOf('sys_setting/get_list')==-1
|
|
&& url.indexOf('sso/get_sso_token_by_code')==-1
|
|
&& url.indexOf('save_confirm_log')==-1
|
|
&& url.indexOf('write_log')==-1);
|
|
if(isCheck){
|
|
checkIP(response.header)
|
|
}
|
|
|
|
if(url.indexOf('mock_user_sso_login')!=-1){
|
|
checkIP(response.header)
|
|
}
|
|
// // 如果需要catch返回,则进行reject
|
|
// if (custom?.catch) {
|
|
// return Promise.reject(data)
|
|
// } else {
|
|
// // 否则返回一个pending中的promise,请求不会进入catch中
|
|
// return new Promise(() => {})
|
|
// }
|
|
}
|
|
return data === undefined ? {} : data
|
|
}, (error) => {
|
|
console.log(error)
|
|
if( error.errMsg=="request:ok") {
|
|
error.errMsg= "request:fail";
|
|
if(error.data!=undefined){
|
|
if(error.data.message!=undefined){
|
|
if(error.data.message=="The token was expected to have 3 parts, but got 1."){
|
|
uni.$u.toast(error.errMsg)
|
|
kickout()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(error.errMsg!==undefined && error.errMsg!=="request:fail" && error.errMsg!=="request:ok" && error.errMsg.indexOf('-1')<=0 && !error.errMsg.includes("request:fail abort")){
|
|
uni.$u.toast(error.errMsg)
|
|
}
|
|
|
|
switch (error.statusCode) {
|
|
case 403:
|
|
break;
|
|
case 400:
|
|
kickout()
|
|
break;
|
|
case 401:
|
|
if(error.config.url.indexOf('refresh_token')==-1 && error.config.url.indexOf('logout')==-1 && !error.config.custom?.tokenRetried){
|
|
error.config.custom = {...error.config.custom, tokenRetried: true};
|
|
return tokenRefresh().then(_ => {
|
|
error.config.header.Authorization = uni.getStorageSync("token");
|
|
error.config.header.RefreshToken = uni.getStorageSync("refreshToken")
|
|
error.config.baseURL = undefined;
|
|
return uni.$u.http.request(error.config);
|
|
})
|
|
}else{
|
|
kickout()
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return Promise.reject(error)
|
|
})
|
|
|
|
}
|
|
function tokenRefresh(){
|
|
const storedRefreshToken = uni.getStorageSync("refreshToken");
|
|
if (storedRefreshToken) {
|
|
return refreshToken({})
|
|
.then((data) => {
|
|
if (!data?.success || !data.accessToken) throw new Error('Token refresh failed');
|
|
uni.setStorageSync("token",data.accessToken);
|
|
uni.setStorageSync("tokenTime",dayjs().unix());
|
|
return Promise.resolve(true)
|
|
})
|
|
.catch(error => {
|
|
kickout()
|
|
return Promise.reject(error);
|
|
})
|
|
} else {
|
|
kickout()
|
|
return Promise.reject(new Error('Missing RefreshToken'));
|
|
}
|
|
}
|
|
function checkToken(){
|
|
let now = Math.floor(new Date().getTime() / 1000);
|
|
let tokenTime = uni.getStorageSync("tokenTime");
|
|
let token = uni.getStorageSync("token")
|
|
//4 min refresh token
|
|
|
|
if(token!="" && now - tokenTime>240){
|
|
tokenRefresh()
|
|
}
|
|
}
|
|
function kickout() {
|
|
uni.removeStorageSync("userData");
|
|
uni.removeStorageSync("token");
|
|
uni.removeStorageSync("idToken");
|
|
uni.removeStorageSync("clientId");
|
|
uni.removeStorageSync("refreshToken");
|
|
uni.redirectTo({
|
|
url:'/pages/login/login'
|
|
})
|
|
}
|
|
function checkIP(header){
|
|
let isInternal = header.IsInternal
|
|
let macauIP = header.MacauIP
|
|
//console.log(header);
|
|
if(isInternal!=undefined){
|
|
let internal = false;
|
|
if(isInternal=="true") internal = true;
|
|
let siteData = uni.getStorageSync("siteData");
|
|
if(siteData){
|
|
siteData.internalTag = internal;
|
|
if(macauIP!=undefined && macauIP!="" && macauIP == "true")
|
|
siteData.macauIp = true;
|
|
else
|
|
siteData.macauIp = false;
|
|
uni.setStorageSync("siteData",siteData);
|
|
}
|
|
/*if(!internal){
|
|
if(macauIP!=undefined && macauIP!="" && macauIP == "false"){
|
|
getApp().navTo('/pages/regionRestrict/regionRestrict?type=7',0,false); //8
|
|
}
|
|
}*/
|
|
}
|
|
}
|