// +---------------------------------------------------------------------- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ] // +---------------------------------------------------------------------- // | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. // +---------------------------------------------------------------------- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 // +---------------------------------------------------------------------- // | Author: CRMEB Team // +---------------------------------------------------------------------- import store from "../store"; import Cache from '../utils/cache'; import { Debounce } from '@/utils/validate.js' // #ifdef H5 || APP-PLUS import { isWeixin } from "../utils"; import auth from './wechat'; // #endif import { LOGIN_STATUS, USER_INFO, EXPIRES_TIME, STATE_R_KEY } from './../config/cache'; import Routine from '@/libs/routine'; /** * 不依赖 atob 的 base64 解码(小程序环境不提供 atob) */ function base64Decode(str) { var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var output = ''; var i = 0; str = String(str).replace(/[^A-Za-z0-9+/=]/g, ''); while (i < str.length) { var b1 = chars.indexOf(str.charAt(i++)); var b2 = chars.indexOf(str.charAt(i++)); var b3 = chars.indexOf(str.charAt(i++)); var b4 = chars.indexOf(str.charAt(i++)); output += String.fromCharCode((b1 << 2) | (b2 >> 4)); if (b3 !== 64) output += String.fromCharCode(((b2 & 15) << 4) | (b3 >> 2)); if (b4 !== 64) output += String.fromCharCode(((b3 & 3) << 6) | b4); } return output; } function prePage() { let pages = getCurrentPages(); let prePage = pages[pages.length - 1]; // #ifndef APP-PLUS return prePage.route; // #endif // #ifdef APP-PLUS return prePage.$page.fullPath; // #endif } export const toLogin = Debounce(_toLogin, 800) function _toLogin(push, pathLogin) { store.commit("LOGOUT"); let path = prePage(); // #ifdef H5 path = location.pathname + location.search; // #endif if (!pathLogin) pathLogin = '/page/users/login/index' Cache.set('login_back_url', path); const BASIC_CONFIG = uni.getStorageSync('BASIC_CONFIG'); // #ifdef H5 if (isWeixin() && BASIC_CONFIG.wechat_status) { uni.navigateTo({ url: '/pages/users/wechat_login/index', }); } else { uni.navigateTo({ url: '/pages/users/login/index' }) } // #endif // #ifdef MP let url if (!BASIC_CONFIG.wechat_auth_switch) { url = '/pages/users/binding_phone/index?pageType=0' } else { url = '/pages/users/wechat_login/index' } uni.navigateTo({ url }) // #endif // #ifdef APP-PLUS uni.navigateTo({ url: '/pages/users/login/index' }) // #endif } export function checkLogin() { let token = Cache.get(LOGIN_STATUS); let expiresTime = Cache.get(EXPIRES_TIME); let newTime = Math.round(new Date() / 1000); if (expiresTime < newTime || !token) { uni.setStorageSync('authIng', false) Cache.clear(LOGIN_STATUS); Cache.clear(EXPIRES_TIME); Cache.clear(USER_INFO); Cache.clear(STATE_R_KEY); return false; } else { store.commit('UPDATE_LOGIN', token); // 从 JWT payload 中恢复 uid / unionid try { let parts = token.split('.'); if (parts.length === 3) { let payload = parts[1] .replace(/-/g, '+') .replace(/_/g, '/'); while (payload.length % 4 !== 0) payload += '='; let data = JSON.parse(base64Decode(payload)); if (data.uid) store.commit('SETUID', data.uid); if (data.unionid) { store.commit('SET_UNIONID', data.unionid); Cache.set('UNIONID', data.unionid); console.log('[checkLogin] unionid 已从 JWT 恢复:', data.unionid); } } } catch (e) {} // 恢复缓存的 openid const cachedOpenid = Cache.get('OPENID'); if (cachedOpenid) { store.commit('SET_OPENID', cachedOpenid); console.log('[checkLogin] openid 已从缓存恢复:', cachedOpenid); } // 恢复缓存的 unionid const cachedUnionid = Cache.get('UNIONID'); if (cachedUnionid) { store.commit('SET_UNIONID', cachedUnionid); console.log('[checkLogin] unionid 已从缓存恢复:', cachedUnionid); } else { console.log('[checkLogin] unionid 缓存为空'); } // 从 userInfo 缓存恢复 let userInfo = Cache.get(USER_INFO, true); if (userInfo) { store.commit('UPDATE_USERINFO', userInfo); if (!cachedUnionid && userInfo.unionid) { console.log('[checkLogin] unionid 已从 userInfo 恢复:', userInfo.unionid); } } return true; } }