无感知刷新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日

相关文章

  • JSON 客户端和服务器端的格式转换

    JSON(JavaScript 对象表示法)是一种轻量级数据交换格式,通常用于客户端与服务器端进行数据传输。在客户端和服务器端之间进行数据传输时,常常需要进行 JSON 格式的转换。接下来,我将为您提供一份详细的 JSON 客户端和服务器端的格式转换攻略。 JSON 格式转换 在进行 JSON 格式转换之前,我们首先需要了解两种形式的数据表示方法: JSON…

    JavaScript 2023年5月27日
    00
  • 基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享

    关于“基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果”的完整攻略,我将结合文本和代码示例作详细讲解。 什么是OO OO是指面向对象(Object-Oriented)编程,它是一种编程方法,适合制作带有交互动态效果的网页。在OO编程中,把一类事物看作一个对象,这个对象有自己的属性和方法,方法就是对象的行为。 基于OO的动画附加插件 此处我们使用一个Jav…

    JavaScript 2023年6月10日
    00
  • Ajax+js实现异步交互

    实现”Ajax+js实现异步交互”的具体步骤如下: 创建 XMLHttpRequest 对象 使用Js 中的 XMLHttpRequest 对象创建Ajax请求,该对象用来与服务器交互,从服务器请求数据和处理响应。 var xmlhttp; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Oper…

    JavaScript 2023年6月11日
    00
  • JavaScript 中URL 查询字符串(query string)的序列与反序列化的方法

    下面就是在 JavaScript 中URL 查询字符串(query string)的序列化与反序列化的方法的攻略: URL 查询字符串序列化 如果我们想在 JavaScript 中将一个对象转换为 URL 查询参数字符串,可以使用默认的 toString() 方法。toString() 方法可以遍历一个对象中的属性并将其转换为 URL 查询参数字符串。这里是…

    JavaScript 2023年5月19日
    00
  • JavaScript验证知识整理

    当我们在制作网站时,常常需要对用户输入的信息进行验证,以确保输入的信息符合要求。JavaScript是一种经常用于验证输入信息的编程语言。下面是对”JavaScript验证知识整理”的完整攻略: 1.输入验证的重要性 在前端开发中,输入验证是非常重要的一项内容,因为它直接关系到用户体验和系统安全。如果用户输入的数据不健全,就会在网站运行时引发一系列的问题。 …

    JavaScript 2023年5月18日
    00
  • JavaScript高级程序设计 阅读笔记(十二) js内置对象Math

    以下是对JavaScript高级程序设计中Math对象的详细讲解: 什么是Math对象 Math对象是JavaScript内置的一个全局对象,提供了许多数学计算相关的方法和常量。通过调用Math对象提供的方法和属性,我们可以进行数值的运算、随机数的生成等操作。 常用方法 Math.abs() Math.abs() 方法用于返回一个数的绝对值,即该数与 0 的…

    JavaScript 2023年5月27日
    00
  • JS中内存泄漏的几种情况

    JavaScript 中的内存泄漏是指程序中使用的内存不再被需要却没有被释放,最终导致浏览器或者 Node.js 进程使用的内存越来越大,直到程序崩溃或者系统运行缓慢。 在 JavaScript 中,内存泄漏通常是由于变量、对象、闭包、事件监听器等长期存在而没有被释放引起的。这些长期存在的引用会阻止垃圾回收器回收内存,最终导致内存泄漏。     内存泄漏通常…

    JavaScript 2023年5月9日
    00
  • JavaScript中立即执行函数实例详解

    JavaScript中的立即执行函数是指在定义后立即执行的函数,该函数执行后,返回值即被抛弃,仅保留函数内部的执行结果,不会对全局环境造成污染。本文将详细讲解JavaScript中立即执行函数的各个方面,包括基本语法、应用示例以及优缺点等。 基本语法 JavaScript中的立即执行函数需要使用一对匿名函数进行定义,但为了避免匿名函数对全局环境造成影响,并使…

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