import weappJwt from './weapp-jwt.js'; const utils = require('../utils/util.js') let Constant = require('../utils/constant.js') let app = getApp() let ACCESS_TOKEN_KEY = 'AccessToken' const expiredDateOffset = -1000 * 60 * 5; let API = (params) => { let defaultParams = { url: '', method: "GET", data: "", header: { 'content-type': 'application/json' }, success: function () {}, fail: function () {}, complete: function () {} }; let requestParam = Object.assign(defaultParams, params); let tokenInfo = wx.getStorageSync(ACCESS_TOKEN_KEY) let accessToken= tokenInfo.Token if (accessToken) { // 将 token 添加到请求报文头中 requestParam.header.Authorization = `Bearer ${accessToken}`; // 判断 accessToken 是否过期 const isExpired = checkTokenExpired(accessToken, expiredDateOffset); // token 已经过期 if (isExpired) { // 获取刷新 token const tokenInfo2 = wx.getStorageSync(ACCESS_TOKEN_KEY); let refreshAccessToken=tokenInfo2.RefreshToken if (refreshAccessToken) { const refreshIsExpired = checkTokenExpired(refreshAccessToken); if (refreshIsExpired) { wx.reLaunch({ url: '/login/login/index', }) return } else { requestParam.header.Authorization = `Bearer ${refreshAccessToken}`; } } } } wx.request({ url: requestParam.url, method: requestParam.method, data: requestParam.data, header: requestParam.header, success: res => { // 只能叫 access-token,不能跟 accessTokenKey 一样 const accessToken = res.header['access-token']; // 只能叫 x-access-token',不能跟 refreshAccessTokenKey 一样 const refreshAccessToken = res.header['x-access-token']; // 判断是否是无效 token if (accessToken === 'invalid_token') { wx.reLaunch({ url: '/login/login/index' }) return } // 判断是否存在刷新 token,如果存在则存储在本地 else if (refreshAccessToken && accessToken && accessToken !== 'invalid_token') { wx.setStorageSync(ACCESS_TOKEN_KEY, { Token: accessToken, RefreshToken: refreshAccessToken, }); } let result = res.data; if (result.Data!= undefined && result.Data == 401) { // 刷新成功后重新发起请求 wx.reLaunch({ url: '/login/login/index' }) return; } if (result.Code && result.Code!= 0) { if (result.Code == -1&& result.Error === 'A099') { wx.reLaunch({ url: '/login/login/index' }) return; } } requestParam.success(res); }, fail: err => { requestParam.fail(err); }, complete: () => { requestParam.complete(); } }); } const checkTokenExpired = (token, expiredOffset = 0) => { const jwt = decryptJWT(token); const date = getJWTDate(jwt.exp) const exp = date.getTime() + expiredOffset; const currentTime = new Date().getTime(); const isExpired = currentTime > exp; return isExpired; }; /** * 刷新令牌的函数 * @returns {Promise} - 刷新令牌的异步操作的 Promise 对象 */ //解密 JWT token 的信息 function decryptJWT(token) { let jwt_token = defaultClone(token) return weappJwt(jwt_token) } function defaultClone (value){ return JSON.parse(JSON.stringify(value)) } //将 JWT 时间戳转换成 Date function getJWTDate(timestamp) { return new Date(timestamp * 1000); } export default API