无感知刷新Token示例简析

yizhihongxing

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

相关文章

  • JavaScript实现二叉树的先序、中序及后序遍历方法详解

    JavaScript实现二叉树的先序、中序及后序遍历方法详解 一、二叉树的定义 二叉树是一个每个节点最多有两个子树的树结构,通常分为左子树、右子树。二叉树有多种遍历方式,包括先序遍历、中序遍历和后序遍历。 其中, 先序遍历:按照“根结点-左子树-右子树”的方式遍历二叉树; 中序遍历:按照“左子树-根结点-右子树”的方式遍历二叉树; 后序遍历:按照“左子树-右…

    JavaScript 2023年5月28日
    00
  • Textbox控件注册回车事件及触发按钮提交事件具体实现

    Textbox控件注册回车事件及触发按钮提交事件是Web开发中常用的技术之一。下面我将详细讲解如何实现这个功能。 注册回车事件 在Textbox控件中,我们可以向其绑定keypress事件,通过该事件判断当用户按下回车键时执行某些操作,比如提交表单等。下面是一个简单示例: <input type="text" id="my…

    JavaScript 2023年6月11日
    00
  • 教你如何使用 JavaScript 读取文件

    首先我们来讲一下使用 JavaScript 读取文件的基本步骤。 1. 创建一个 input 元素 <input type="file" id="inputFile"> 我们需要在 HTML 中创建一个 input 元素,并设置其 type 属性为 file,获取用户从本地计算机中选择的文件。 2. 监听 …

    JavaScript 2023年5月27日
    00
  • JS实现给不同元素设置不同的定时器

    实现给不同元素设置不同的定时器主要依赖于JavaScript的定时器函数setInterval()和clearInterval()。下面是实现的步骤和注意事项: 步骤: 首先,为不同的元素设置不同的ID或者Class。 在JavaScript中,使用setInterval()函数来设置定时器,该函数会在一定时间间隔内反复运行一个函数。 定义一个执行函数,用来…

    JavaScript 2023年6月11日
    00
  • JS实现动画中的布局转换

    JS实现动画中的布局转换可以通过以下步骤完成: 选择需要转换布局的元素:使用JavaScript的DOM操作选择需要进行布局转换的元素,可以通过ID、class或标签名来选择。 设计转换效果:通过CSS或JavaScript来设置需要进行的布局转换效果,例如平移、缩放、旋转等。 绑定事件:通过JavaScript来绑定需要触发布局转换效果的事件,例如鼠标移入…

    JavaScript 2023年6月10日
    00
  • Web安全测试之XSS实例讲解

    Web安全测试是指对Web应用程序进行安全风险评估的过程。其中,XSS(Cross-site scripting)是一种常见的Web安全漏洞,攻击者通过注入脚本代码实现攻击。以下是对“Web安全测试之XSS实例讲解”的完整攻略: 第一步:寻找输入点 首先根据Web应用程序的业务逻辑找到需要输入的点,例如登录、注册、用户评论等。在这些输入点中,可能会存在输入过…

    JavaScript 2023年6月11日
    00
  • js自定义input文件上传样式

    下面是JS自定义input文件上传样式的完整攻略。我们可以通过JS代码来自定义input文件上传样式,从而提升用户体验。 创建文件上传按钮 我们可以通过HTML代码来创建文件上传按钮,如下所示: <input type="file" id="upload-file"> 隐藏默认文件上传按钮 当我们创建了文件…

    JavaScript 2023年6月10日
    00
  • JSON+HTML实现国家省市联动选择效果

    下面我将详细讲解“JSON+HTML实现国家省市联动选择效果”的完整攻略,包括以下几个方面: 准备数据 首先,我们需要准备国家省市的数据,放在一个JSON格式的数据文件中。例如,我们可以创建一个名为”china.json”的文件,内容如下: { "country": [ { "name": "中国"…

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