项目中2个Token的原因

news/2024/7/9 23:50:12 标签: vue, ajax


在这里插入图片描述

问题:
项目中2个Token, 一个时效2个小时(简称:短Token), 另一个时效14天(简称:长Token),
为什么要用2个Token?

解答:

  1. 基于安全性, 防止Token泄露的考虑, 服务器资源中所有的请求都只能使用短Token, 并且短Token只有2小时时效;
    1. 这个方法依然无法完全解决防止Token泄露的问题, 只是在一定程度上提高防止Token泄露的安全性;
    2. 长Token的作用只有一个, 就是短Token时效了的时候, 用长Token去请求获取新的短Token,
      只有这个接口中, 才能用长Token发请求.
  2. 为了提高用户的体验, 不至于直接让用户退出正在操作的页面

import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import { getToken, setToken } from './token'
import router from '../router/index.js'
import { Toast } from 'vant'

Vue.use(VueAxios, axios)

const instance = axios.create({
  baseURL: '基地址',
  timeout: 100000
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 统一添加token
    getToken() && (config.headers['Authorization']= `Bearer ${getToken().token}`)
    return config
  },
  function (error) {
    return Promise.reject(error)
  }
)

// 添加响应拦截器
/**
 * 1.if 401 else 不管
 * 2.if 有token else 跳转登录页
 * 3.try-catch 用 refresh_token 去获取 token, if 成功 else refresh_token失效了,跳转登录页
 * 4.保存获取的 token, 更新, 继续执行用户要的操作
 */
instance.interceptors.response.use(
  function (response) {
    return response
  },
  async function (error) {
    if (401 === error.response.status) {
      setTimeout('console.clear()', 2000)
      if (getToken()) {
        try {
          // 登录了, 但是短T过期, 用长T获取短T(刷新用户token)
          let res = await axios({
            url: '基地址/v1_0/authorizations',
            method: 'PUT',
            headers:{Authorization : `Bearer ${getToken().refresh_token}`}
          })
          // 更新短T
          let token = getToken()
          token.token = res.data.data.token
          setToken(token)
          // 继续用户操作
          return instance(error.config)
        } catch (error) {
          // 长T失效,跳转登录页
          Toast.fail('请先登录')
          router.push({ path: '/login' })
        }
      } else {
        // 未登录,跳转登录页
        Toast.fail('请先登录')
        router.push({ path: '/login' })
      }
    }

    return Promise.reject(error)
  }
)

export default instance


http://www.niftyadmin.cn/n/1263688.html

相关文章

JS之预解析和变量提升

什么是预解析? 概念: JS代码在在代码从上往下执行前,浏览器会先把所有变量声明解析一遍, 这个阶段叫预解析。 详讲 寻找作用域中的var 和function声明(匿名函数没有function声明,所以不会提升),然后对其进行事先声明…

JS三座大山-同步异步-作用域、闭包-原型、原型链

JS三座大山-同步异步-作用域、闭包-原型、原型链JS三座大山同步异步同步异步区别作用域、闭包函数作用域链块作用域闭包闭包和直接返回值有差别闭包的几种写法闭包作用1:延长变量生命周期闭包作用2: 限制访问闭包调用注意事项闭包解决用var导致下标错误的…

解决vue中, vant插件,van-img标签无法读取本地图片问题

问题 在使用移动端布局框架, vantjs的时候, 本地图片无法加载: 解决 先将需要使用的图片导入import imgA from /assets/a.jpg import imgB from /assets/b.jpg将导入的图片, 放到data数据中:// 这里采用对象简写形式 data () {return {imgA,imgB} },结构代码: 由于src需要读…

JS-函数防抖与节流

JS-函数防抖与节流目录防抖引入防抖场景1(鼠标移入)防抖场景2(键盘按键)函数节流防抖 经典应用常见: 手风琴效果 引入 没有做防抖的网站: 做了防抖的网站: 防抖场景1(鼠标移入) 抖动 : 用户本来不想触发这个交互,但是由于鼠标不小心抖动误触发交互…

项目中, 后端使用其他网站的图片等资源报403与404错误

出现404与404错误原因 因为我们的服务器里面的图片并不是自己的,而是从网上找的一些图片链接;403原因:没有权限。 有的服务器图片做了防盗链处理,不允许在别人的网页去获取他们的服务器;404原因:路径错误。 有的图片可能被别人删…

聊天室功能-消息过多时, 怎么让滚动条位于最底部?

// 滚动条自动滚到最底部 this.$refs.char.scrollTop this.this.$refs.offsetHeight

ES2015(ES6)+

JES2015-ES6目录名词释义ECMAScriptES2015ES6let 和 const箭头函数函数的参数默认值用法示例模板字符串扩展(展开) 运算符解构赋值对象解构赋值数组的解构赋值应用-解构赋值结合函数声明对象成员的简写概述Symbol作为对象属性Symbol.for内置SymbolSymbol…

面试-三次握手和四次挥手

面试-三次握手和四次挥手目录TCP/IP报文格式三次握手四次挥手为什么握手一定要三次?为什么挥手一定要四次?TCP/IP报文格式 只针对本节需要讲解的内容, 对报文格式内容进行简单提取: 序列号(Sequence Number)    该字段用来标识TCP源端设备向目的端…