/** * Created by Andste on 2018/5/7. */ import Vue from 'vue' import Storage from './storage' import request, { API } from '@/utils/request' import store from '@/store' /** * 检查token: * 1. user/accessToken/refreshToken都不存在。 * 表示用户没有登录,不能放行需要登录的API * 2. 不存在accessToken,但是user/refreshToken存在。 * 表示accessToken过期,需要重新获取accessToken。 * 如果重新获取accessToken返回token失效错误,说明已被登出。 * @param options * @returns {Promise} */ export default function checkToken(options) { // uid const uid = Storage.getItem('uid') // 访问Token const accessToken = Storage.getItem('access_token') // 刷新Token const refreshToken = Storage.getItem('refresh_token') //刷新token过期时间 const refreshTokenTimeout = Storage.getItem('refresh_token_timeout') //access_token过期时间 const accessTokenTimeout = Storage.getItem('access_token_timeout') const uuid = Storage.getItem('uuid') //当前时间戳 const now = Math.round(new Date() / 1000) // 返回异步方法 return new Promise((resolve, reject) => { /** * 如果accessToken、uid、refreshToken都存在。 * 说明必要条件都存在,可以直接通过,并且不需要后续操作。 */ var checkLock // console.log('accessTokenout', !accessTokenTimeout || accessTokenTimeout <= now) if (accessToken && uid && refreshToken && accessTokenTimeout && now < accessTokenTimeout) { resolve() return } /** * 如果需要Token,但是refreshToken或者uid没有。 * 说明登录已失效、或者cookie有问题,需要重新登录。 */ //刷新token失效了,需要重新登陆获取 if (!refreshTokenTimeout || refreshTokenTimeout < now) { //刷新token失效,直接退出 // uni.redirectTo({ // url: '/pages/login/index' // }) resolve() return } if (!accessTokenTimeout || accessTokenTimeout <= now) //access_token 失效 刷新token { console.log('refreshtoken') const param = { 'refresh_token': refreshToken } uni.request({ url: `${API.buyer}/passport/token`, method: 'POST', header: { 'Content-Type': 'application/x-www-form-urlencoded', 'uuid': uuid }, data: param, success(res) { console.log(res) const final = {} const { accessToken, refreshToken, accessTokenTimeout, refreshTokenTimeout } = res.data.accessToken ? res.data : final // 刷新成功 更新凭证数据 console.log('refreshToken', accessToken) if (accessToken && refreshToken && accessTokenTimeout) { const now = Math.round(new Date() / 1000) store.dispatch('setAccessTokenAction', accessToken) store.dispatch('setRefreshTokenAction', refreshToken) Storage.setItem('access_token_timeout', now + accessTokenTimeout - 60) Storage.setItem('refresh_token_timeout', now + refreshTokenTimeout - 60) resolve() } else { //刷新返回数据错误 Storage.removeItem('access_token_timeout') Storage.removeItem('refresh_token_timeout') Storage.removeItem('access_token') Storage.removeItem('refresh_token') uni.redirectTo({ url: '/pages/login/index' }) return } }, fail(err) { //刷新token失败 Storage.removeItem('access_token_timeout') Storage.removeItem('refresh_token_timeout') Storage.removeItem('access_token') Storage.removeItem('refresh_token') uni.redirectTo({ url: '/pages/login/index' }) return } }) } else { //accessToken 有效 resolve() } }) }