双token无感刷新

news2024/11/15 1:34:34

文章目录

  • 🟢双token无感刷新
    • 1、token过期续期的五种方案对比
    • 2、双token的基本概念
    • 3、双token无感刷新的原理
    • 4、双token无感刷新的实现方式
    • 5.前端实现
  • ✒️总结


🟢双token无感刷新

在这里插入图片描述

对于token无感刷新这个东西有复杂度的话,它主要在后端,它前端有啥复杂度,我估计吧,可能大多数对这个无感token刷新的概念不清除。所以本篇文章主要针对这块梳理一下。
双token无感刷新是一种在Web开发中常用的安全及用户体验优化技术,主要涉及到两种类型的token:Access Token(访问令牌)和Refresh Token(刷新令牌)。以下是对双token无感刷新的详细解释

1、token过期续期的五种方案对比

  • token过期后
    • 方案一:跳登录页=>突然需要登录体验不好
    • 方案二:刷新token重新发=>一直不用登录(但也可以设置过期时间)
    • 方案三:每次请求都刷新token=>服务器计算压力大
    • 方案四:token不过期、redis记录过期=>服务端维护用户身份
    • 方案五:双token(token1正常使用、token2用来刷新token)

2、双token的基本概念

  • Access Token(访问令牌):
    • 用户直接用于访问受保护资源的凭证。
    • 有效期较短,通常几分钟到几小时,一旦过期,用户需要重新认证以获取新的Access Token。
    • 即使Access Token被泄露,由于其有效期短,攻击者利用它进行不当操作的时间窗口有限。
  • Refresh Token(刷新令牌):
    • 用于在Access Token过期后或过期前的一个定时间内重新获取新的Access Token。
    • 有效期通常较长,甚至可以说是永久的,但出于安全考虑,一般会设置过期时间或使用次数限制。
    • Refresh Token通常不会直接发送给客户端,而是保存在服务器端或经过加密后存储在客户端本地(如localStorage或sessionStorage)。

3、双token无感刷新的原理

双token无感刷新的核心在于自动在后台处理Access Token的过期和刷新过程,而无需用户重新登录或感知到这一过程。具体步骤如下:
1.用户登录

  • 用户通过用户名(账号)、密码或其他认证方式向认证服务器请求授权。
  • 认证成功后,服务器返回Access Token和Refresh Token给前端。

2.请求受保护资源

  • 前端在访问受保护资源时,将Access Token放入请求头中发送给后端。
  • 如果Access Token有效,后端正常处理请求并返回结果。

3.请求受保护资源

  • 如果Access Token过期,后端会返回一个错误响应(如HTTP 401 Unauthorized)。
  • 前端在接收到错误响应后,自动在后台使用Refresh Token向认证服务器请求新的Access Token。
  1. 刷新Access Token
  • 认证服务器验证Refresh Token的有效性后,返回一个新的Access Token和(可选的)新的Refresh Token。
  • 前端更新本地存储的Access Token和Refresh Token,并重新发起之前的请求。

4、双token无感刷新的实现方式

双token无感刷新的实现通常依赖于前端和后端的配合。以下是一个简化的实现流程:

  1. 前端:
    • 在请求拦截器中拦截请求,检查Access Token是否即将过期或已过期。
    • 如果Access Token过期,则自动使用Refresh Token请求新的Access Token,并更新本地存储。
    • 将之前因Access Token过期而失败的请求重新发起。
  2. 将之前因Access Token过期而失败的请求重新发起。
    • 验证Access Token的有效性。。
    • 如果Access Token过期,返回错误响应,并允许使用Refresh Token来刷新Access Token。
    • 验证Refresh Token的有效性,并返回新的Access Token和(可选的)新的Refresh Token。

5.前端实现

  • 设置全局Axios拦截器
import axios from 'axios';  
import store from './store'; // 假设你有一个Vuex或Redux等状态管理库  
  
// 创建axios实例  
const service = axios.create({  
  baseURL: process.env.VUE_APP_BASE_API, // api的base_url  
  timeout: 5000 // 请求超时时间  
});  
  
// 请求拦截器  
service.interceptors.request.use(  
  config => {  
    // 从状态管理库或其他地方获取token  
    const accessToken = store.getters.accessToken;  
    if (accessToken) {  
      config.headers['Authorization'] = `Bearer ${accessToken}`;  
    }  
    return config;  
  },  
  error => {  
    // 处理请求错误  
    console.error('请求错误:', error); // for debug  
    Promise.reject(error);  
  }  
);  
  
// 响应拦截器  
service.interceptors.response.use(  
  response => {  
    // 响应正常则返回  
    return response;  
  },  
  error => {  
    // 响应错误处理  
    const { config, response, code } = error;  
    // 检查是否是401错误(未授权),且是由于token过期导致  
    if (response && response.status === 401 && response.data.code === 'TOKEN_EXPIRED') {  
      // 调用刷新token的函数  
      return refreshToken(config).then(accessToken => {  
        // token刷新成功,重新请求  
        config.headers['Authorization'] = `Bearer ${accessToken}`;  
        return service(config);  
      }).catch(err => {  
        // token刷新失败,清除tokens并跳转到登录页面  
        store.commit('clearTokens');  
        // 你可以在这里进行页面跳转等操作  
        window.location.href = '/login';  
        return Promise.reject(err);  
      });  
    }  
    // 其他错误直接返回  
    return Promise.reject(error);  
  }  
);  
  
// 刷新token的函数  
function refreshToken(config) {  
  return new Promise((resolve, reject) => {  
    const refreshToken = store.getters.refreshToken;  
    if (!refreshToken) {  
      reject('No refresh token');  
    }  
  
    // 发送请求以刷新token  
    axios.post('/api/auth/refresh-token', { refreshToken })  
      .then(response => {  
        // 更新state中的token  
        store.commit('updateAccessToken', response.data.accessToken);  
        resolve(response.data.accessToken);  
      })  
      .catch(err => {  
        reject(err);  
      });  
  });  
}  
  
export default service;
  • 状态管理(Vuex示例)
// store.js  
const store = new Vuex.Store({  
  state: {  
    accessToken: localStorage.getItem('accessToken') || '',  
    refreshToken: localStorage.getItem('refreshToken') || ''  
  },  
  getters: {  
    accessToken: state => state.accessToken,  
    refreshToken: state => state.refreshToken  
  },  
  mutations: {  
    updateAccessToken(state, accessToken) {  
      state.accessToken = accessToken;  
      localStorage.setItem('accessToken', accessToken);  
    },  
    clearTokens(state) {  
      state.accessToken = '';  
      state.refreshToken = '';  
      localStorage.removeItem('accessToken');  
      localStorage.removeItem('refreshToken');  
    }  
  }  
});  
  
export default store;

✒️总结

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端端或者对python感兴趣的朋友,请多多关注💖💖💖,咱们一起探讨和努力!!!
👨‍🔧 个人主页 : 前端初见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站建设的服务器该如何选择?

服务器的选择对于网站的稳定运行、性能表现以及成本控制至关重要。以下是一些关键的考虑因素,帮助你选择适合的服务器: 明确需求:你需要先明确网站的需求和目标。这包括确定服务器将用于托管什么样的应用(如Web前端、应用服务器、…

C/C++:优选算法(持续更新~~)

一、双指针 1.1移动零 链接:283. 移动零 - 力扣(LeetCode) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操…

【算法】BFS 系列之 多源 BFS

【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1)01 矩阵 .1- 题目解析 .2- 代码编写 2)飞地的数量 .1- 题目解析 .2- 代码编写 3)地图中的最高点 .1- 题目解析 .2- 代码编写 4)地图分析 .1- 题…

103.运行tomcat的Tomcatstartup.bat时,终端打印的中文显示为乱码

目录 原因 解决方法 原因 当运行Tomcat的Tomcatstartup.bat时,如果终端中文显示为乱码,这通常是因为Tomcat使用的日志输出编码与Windows命令行默认的编码不匹配。 解决方法 针对这一问题,你可以尝试以下步骤来解决&#…

【Spring】IocDI详解(6)

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 有什么不懂的都可以问我,看到消息会回复的,可能会不及时,请见谅!! 目录 本系列共…

深度图可视化显示(kitti)

文章目录 前言一、读取深度值与图像1、深度值读取2、图像读取 二、深度图可视化1、深度图可视化代码2、深度图可视化结果展示 三、深度图在图像上可视化1、可视化代码2、可视化坐标显示 四、完整代码 前言 kitti数据是一个通用数据,有关kitti的深度图像内容我已有博…

扣子智能体实战:一键生成公众号图文,AI时代文盲也能写公众号,赚钱秘籍

文章目录 一,需求简述二,智能体制作1,智能体人设和技能2,流程开发2.1 设置开始节点2.2 增加一个生成标题的大模型节点2.3 增加一个代码节点 2.4 增加一个插件节点用以生成文章配图2.4 增加一个大模型节点-根据标题和思路生成文章大…

Excel--WPS 函数与公式技巧(轻松搞定各类排名)

一、直接按成绩或数值的排序(rank函数轻松搞定) 以上函数非常简单,记住两点: 1.rank排名同分作为同一名次,后面的名次需要占位,如,以上两个70分,同为第8名,那么第9名将被…

Shader 中的光源

1、Shader 开发中常用的光源属性 Unity当中一共支持四种光源类型: 平行光(Directional)点光源(Point)聚光灯(Spot)面光源(Area)— 面光源仅在烘焙时有用 不管光源类型到…

可视化工具箱-Visualization Toolkit(VTK)

一、Visualization Toolkit(VTK)简概 可视化工具箱(VTK),是一个用于3D计算机图形、图像处理和科学可视化的开源软件系统,其包含C类库和Tcl/Tk、Java与python的解释型接口层。VTK支持各种可视化算法&#xf…

软设9.20

1 已知一个文件中出现的各字符及其对应的频率如下表所示。若采用定长编码,则该文件中字符的码长应为()。若采用Hufman编码,则字符序列“face”的编码应为()。 1.() A.2 B.3 C.4 D.5 2.() A.110001001101…

小程序构建npm失败

小程序构建npm失败 项目工程结构说明解决方法引入依赖导致的其他问题 今天在初始化后的小程序中引入TDesign组件库,构建npm时报错。 项目工程结构说明 初始化后的项目中,包含miniprogram文件夹和一些项目配置文件,在project.config.json文件中…

VS运行程序时报错--无法定位程序输入点

发现问题: VS 在运行程序时,报错: 找到原因: 因为我在替换动态库的时候,只替换了lib库,没有替换运行目录下的dll库,运行时候的dll与程序中的lib库不对应。 替换库后就能解决这个问题。

秋意渐浓,温暖筹备——铁路职工御寒劳保鞋,寒冬无阻!

随着秋意渐浓,气温逐渐走低,冬日的寒风已在不远处蓄势待发。对于坚守在铁路一线的工友们来说,这不仅是季节的变换,更是工作装备升级换代的信号。意味着需要更加注重防寒保暖,以确保在寒冷的天气中能够安全、高效地工作…

前端大数据渲染:虚拟列表、触底加载与分堆渲染方案

前言 针对表格展示数据,用户提出要求前端在表格下面有一展示多少条数据的选项,如果要求一次性展示10000条数据,如果直接染会造成页面的卡顿,渲染速度下降,内容展示慢,如果有操作,操作会卡顿 下面总结常见…

工程师 - PFM介绍

在电子电路设计中,PFM(Pulse Frequency Modulation,脉冲频率调制)是一种调制技术,其主要特点是在负载变化时调整脉冲的频率,而保持脉冲的宽度(时间长度)相对恒定。与PWM(…

lambda 自调用递归

从前序与中序遍历序列构造二叉树 官方解析实在是记不住&#xff0c;翻别人的题解发现了一个有意思的写法 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {auto dfs [](auto&& dfs, auto&&…

深度学习-图像处理篇1.1-1.2神经网络

1.1卷积神经网络基础 卷积层 对彩色RGB图像进行卷积 1.卷积核的通道数与输入特征层的通道数相同 2.卷积输出的特征矩阵通道数与卷积核个数相同 池化层 池化中一般池化核大小和步长大小一样 思考 加上偏移量bias该如何计算? 卷积计算时加上偏移量即可 加上激活函数该如何计…

Nomad Web服务终于成熟了!

大家好&#xff0c;才是真的好。 9月份HCL Notes/Domino相关产品发布的还真不少&#xff0c;前脚刚发布了HCL Notes Domino 14.5 EA1&#xff0c;后脚就迎来了Notes Domino 14.0FP2IF1&#xff0c;还有Nomad 1.0.13版本。 在我的记忆中&#xff0c;他们不喜欢数字13&#xff…

分布式消息中间件kafka

文章目录 什么是kafka?整体架构 kafka核心概念1. 生产者 (Producer)2. 消费者 (Consumer)3. 主题 (Topic)4. 分区 (Partition)5. 经纪人 (Broker)6. 复制 (Replication)7. 消费者组 (Consumer Group)8. 日志段 (Log Segment) 主要功能1. 高吞吐量2. 可靠的消息传递3. 发布/订阅…