设置token笔记

102 阅读1分钟
const TokenKey = 'hdq_token'
const ExpiresKey = 'hdq_token_expires'
const refreshTokenKey = "hdq_refresh_token"
import {
  Message
} from 'element-ui'
import {
  login
} from "@/api/apiUser"
import $store from "@/store"
import $router from '@/router'


let tokenMsg

export function setToken(token) {
  return localStorage.setItem(TokenKey, token)
}

export function getToken() {
  return localStorage.getItem(TokenKey)
}

export function setRefreshToken(refresh_token) {
  return localStorage.setItem(refreshTokenKey, refresh_token)
}

export function getRefreshToken() {
  return localStorage.getItem(refreshTokenKey)
}

export function setExpires(time) {
  let now = new Date().getTime()
  return localStorage.setItem(ExpiresKey, now + time * 1000)
}

export function removeToken() {
  localStorage.removeItem(ExpiresKey)
  return localStorage.removeItem(TokenKey)
}

export async function checkToken(notice = true) {
  let expires = localStorage.getItem(ExpiresKey)
  let currentTime = new Date().getTime()
  if (expires) {
    expires = parseInt(expires)
    // 先判断有没有过期 如果过期了 直接跳登录页重新登录 如果5分钟后过期 掉刷新tocken接口重新获取token
    if (currentTime >= expires) {
      if (!tokenMsg) {
        tokenMsg = Message.error({
          message: '认证已失效,请重新登录',
          showClose: true,
          onClose: () => {
            tokenMsg = null
          }
        })
      }
      localStorage.setItem(TokenKey, '')
      $store.dispatch("user/logout").then(() => {
        $store.dispatch("setThemeColor", "#0081E4");
        $router.push("/login");
      });
    } else {
      if ((expires - currentTime) <= 5 * 60 * 1000) {
        // 快过期了 更新token
        let refresh_token = getRefreshToken()
        if (refresh_token) {
          let res = await login({
            refresh_token: refresh_token,
            grant_type: 'refresh_token'
          })
          try {
            setToken(`${res.token_type} ${res.access_token}`)
            setExpires(res.expires_in)
            setRefreshToken(res.refresh_token)
            $store.dispatch('user/changeSetting', {
              tokenType: res.token_type,
              token: res.access_token,
              refresh_token: res.refresh_token
            })
          } catch (error) {
            // 更新失败 直接去登录页
            $store.dispatch("user/logout").then(() => {
              $store.dispatch("setThemeColor", "#0081E4");
              $router.push("/login");
            });
          }
        }
      }
    }
  } else {
    return false
  }
}