无感知刷新Token示例简析

针对“无感知刷新Token示例简析”,我将提供完整的攻略,分为以下几个部分:背景介绍、方案设计、示例说明及参考文献。

背景介绍

随着Web应用不断扩大的规模和复杂度,用户态Token的安全性逐渐成为了不容忽视的问题,攻击者可以通过钓鱼、中间人等手段,窃取用户的Token,进而对用户的数据造成损失。为了解决这个问题,开发者可以通过刷新Token的方式,定期更换生成新的Token。但是在用户态下,对于token刷新的操作是不可避免的。
本文将介绍如何通过无感知的方式,刷新用户Token而不影响用户体验。

方案设计

为了实现无感知刷新Token的目的,我们可以采用以下的方案:

  1. 在每个需要用户验证的资源接口(比如API)中,都需要对Token进行校验,如果Token过期,则进行自动刷新。

  2. 在Token过期时,需要发出异步请求,在后端重新生成Token,并将新Token存储在数据库或Redis等存储介质中,并将新Token返回给前端。

  3. 在前端接收到新Token的响应后,我们需要将新Token更新到本地存储中。此时无需重载页面即可进行无感刷新Token,之后用户的操作需要使用新Token(否则操作会一直被forbidden)。

示例说明

以JavaScript的Fetch请求为例,以下提供两种实现无感知刷新Token的示例:

  1. 使用Fetch Interceptor
import auth from './auth'

// 构建fetch拦截器
class FetchInterceptor {
  static instance

  // 获取拦截器实例
  static getInstance () {
    if (!this.instance) {
      this.instance = new FetchInterceptor()
    }
    return this.instance
  }

  // 请求拦截器,用于自动注入请求头
  interceptRequest (url, config) {
    // 从本地存储中获取token
    const token = auth.getToken()

    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }

    return [url, config]
  }

  // 响应拦截器,自动刷新过期token
  async interceptResponse (response) {
    // 访问受限,判断是否token过期
    const data = await response.json()
    if (response.status === 401) {
      // 过期了,发起刷新token的请求,将新的token存储到本地存储中
      const newToken = await auth.refreshToken()
      // 存储新的token
      auth.saveToken(newToken)

      // 构建新的请求headers
      const headers = new Headers(response.headers)
      headers.set('Authorization', `Bearer ${newToken}`)

      // 构建新的响应对象
      let newResponse = new Response(response.body, {
        status: response.status,
        statusText: response.statusText,
        headers
      })
      return newResponse
    }

    // 非401请求直接返回
    return response
  }
}

// 处理完 intercept 链之后的 request 函数
async function intercept (url, config) {
  const interceptors = [FetchInterceptor.getInstance()]
  let request = [url, config]

  // 按照顺序来执行拦截器
  for (let i = 0; i < interceptors.length; i++) {
    const [newUrl, newConfig] = await interceptors[i].interceptRequest(...request)
    request = [newUrl, newConfig]
  }

  const response = await fetch(...request)

  // 针对返回值做hack处理
  for (let i = interceptors.length - 1; i >= 0; i--) {
    const newResponse = await interceptors[i].interceptResponse(response)
    response = newResponse || response
  }

  return response
}

function get (url) {
  return intercept(url, { method: 'GET' })
}

export default {
  get
}
  1. 使用Axios Interceptor
import axios from 'axios'
import auth from './auth'

// 初始化Axios实例
const instance = axios.create()

// 拦截器配置
instance.interceptors.request.use(
  (config) => {
    // 从本地存储中获取token
    const token = auth.getToken()

    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }

    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

instance.interceptors.response.use(
  (response) => {
    return response
  },
  async (error) => {
    const {
      config,
      response: { status }
    } = error

    if (status === 401) {
      // 获取新的token
      const newToken = await auth.refreshToken()

      // 更新本地token
      auth.saveToken(newToken)

      // 重新加载原有请求
      config.headers.Authorization = `Bearer ${newToken}`
      return instance.request(config)
    }

    return Promise.reject(error)
  }
)

export default instance

参考文献

文章内容参考了以下资料:

  1. Refresh JWT token automatically with Axios interceptor

  2. Vue知识库-无感知刷新Token示例简析

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:无感知刷新Token示例简析 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS倒计时两种实现方式代码实例

    下面我来详细讲解一下“JS倒计时两种实现方式代码实例”的完整攻略。 1. 倒计时实现方式一 1.1 基本思路 通过设定一个起始时间和一个截止时间,计算它们之间的时间差,并将时间差转化为时、分、秒显示在页面上,同时在每隔一秒钟更新一次时间。 1.2 代码实例 //定义起始时间、截止时间变量 var startTime = new Date(‘2021/10/1…

    JavaScript 2023年5月27日
    00
  • javascript合并两个数组最简单的实现方法

    针对这个问题,我将提供以下完整攻略: JavaScript合并两个数组最简单的实现方法 在JavaScript中合并两个数组的方法有很多,但这里我们将要学习最简单的两种方法。它们都是原生JavaScript方法,不依赖于外部库。 方法一:concat()方法 concat()方法通过将两个数组组合在一起来创建一个新数组。数组的元素将首先是第一个数组中的元素,…

    JavaScript 2023年5月27日
    00
  • 微信小程序模板(template)使用详解

    微信小程序模板(template)使用详解 什么是微信小程序模板(template) 微信小程序模板是一种快速开发小程序的方式,类似于其他web开发中的样板(boilerplate)或模板(template)等概念。使用小程序模板,可以减少从零开始开发的代码量,加快小程序开发的速度。 如何使用微信小程序模板 在小程序开发工具中,选择“新建小程序”或“创建项目…

    JavaScript 2023年6月11日
    00
  • DOM节点的替换或修改函数replaceChild()用法实例

    DOM(Document Object Model)是指文档对象模型,它是浏览器中的一种编程接口,允许开发者通过JavaScript来操作HTML文档的每个元素。在DOM中,节点是文档的基础单位。其中replaceChild()函数就是DOM节点的替换或修改函数,我们来详细讲解一下它的用法实例。 什么是replaceChild()函数? replaceChi…

    JavaScript 2023年6月10日
    00
  • php+ajax+json 详解及实例代码

    下面是关于PHP+AJAX+JSON的详细讲解及实例代码的攻略。 PHP+AJAX+JSON 详解 什么是AJAX AJAX全称为Asynchronons JavaScript and XML,是基于前端技术的一种异步交互方式。在AJAX出现之前,前端页面与服务端的交互方式主要是通过页面跳转、表单提交等方式。而AJAX则可以使得前端页面在不进行整个页面刷新的…

    JavaScript 2023年5月27日
    00
  • js 数值项目的格式化函数代码

    讲解JS数字项目的格式化函数代码的攻略如下: 攻略一:格式化函数代码的实现 在JS中,要格式化数字,一般可以通过toLocalString()方法来实现。toLocalString()方法可以将数字转化为本地格式的字符串,例如将数字转化为货币格式。例如下面的代码: var num = 123456.789; // 将数字格式化为本地货币格式并输出 conso…

    JavaScript 2023年6月10日
    00
  • JavaScript 微任务和宏任务讲解

    JavaScript 微任务和宏任务讲解 在 JavaScript 中,异步任务主要分为微任务和宏任务两种。宏任务可以理解为宏大的任务,就是需要花费比较长时间才能完成的任务,比如定时器、ajax 请求、DOM 事件等。微任务可以理解为小任务,比较轻量,基本上可以在当前任务完成后马上被执行,比如 Promise。 在执行异步任务时,引擎会将宏任务放入宏任务队列…

    JavaScript 2023年5月28日
    00
  • Js与Jq获取浏览器和对象值的方法

    我们可以使用 JavaScript 和 jQuery 获取浏览器属性和对象值。下面详细讲解 Js 与 Jq 获取浏览器属性和对象值的方法。 获取浏览器属性 我们可以获取浏览器的宽度、高度、名称、版本等属性。下面是获取浏览器属性的方法: 使用原生 JavaScript 获取浏览器宽度和高度 let width = window.innerWidth; let …

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部