双token无感刷新

文章目录

  • 🟢双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.xdnf.cn/news/145187.html

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

相关文章

【使用Hey对vllm接口压测】模型并发能力

使用Hey对vllm进行模型并发压测 docker run --rm --networkknowledge_network \registry.cn-shanghai.aliyuncs.com/zhph-server/hey:latest \-n 200 -c 200 -m POST -H "Content-Type: application/json" \-H "Authorization: xxx" \-d {"model"…

如何查询论文的SCI检索号?

一、登录Web of Science 不要自己登录,需要选择机构为CHINA CERNET Federation,否则无法查询文章。 然后转到机构,选择对应的大学。 更具对应文章名查询文献。 二、查询文献名

CUDA并行架构

一、CUDA简介 CUDA(Compute Unified Device Architecture)是一种由NVIDIA推出的通用并行计算架构,该架构使GPU(Graphics Processing Unit)能够对复杂的计算问题做性能速度优化。 二、串并行模式 高性能计算的关键是利用多核处理器进行并行计算。 串行模式&#…

使用Anaconda安装pyTorch

1.Anaconda简介 Anaconda 是一个流行的 Python 数据科学和机器学习平台,它简化了包管理和部署,使得安装、运行和升级包及其依赖变得非常容易。Anaconda 通过其内置的 Conda 包和环境管理器,提供了一个强大的环境,用于科学计算&…

鸿蒙手势交互(四:多层手势)

四、多层手势 指父子组件嵌套时,父子组件均绑定了手势或事件。有两种,一种默认多层级手势事件,一种自定义多层级手势事件。 默认多层级手势事件:需要分清两个概念,触摸事件,手势与事件 触摸事件&#xf…

介绍个酷炫,适合装逼的命令

Hollywood - 给你的命令行加点魔法般的动画效果 作为命令行的重度用户,你是否想让枯燥的终端界面来点生动有趣的元素?Hollywood来了!这是一个无比诙谐、小巧玲珑而又功能强大的动画效果命令行工具。 Hollywood可以为文本添加各种动画效果,让你的输出显示得像电影般生动活泼。…

powerbi -L10-文件夹内的文件名

powerbi -L10-文件夹内的文件名 Folder.Contents letSource Folder.Contents("\\your_folder\ your_folder "),#"Removed Other Columns" Table.SelectColumns(Source,{"Name", "Date modified", "Folder Path"}), in#&q…

小新-13 2019 Intel款IML版【81UQ】原装出厂Win10系统镜像下载

恢复lenovo联想开箱状态,自带预装OEM系统安装包 链接:https://pan.baidu.com/s/1wwPriBoIwNOAfL-YcX1F7g?pwdg7ki 提取码:g7ki 联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软…

视频单目标跟踪研究

由于对视频单目标跟踪并不是很熟悉,所以首先得对该领域有个大致的了解。 视频目标跟踪是计算机视觉领域重要的基础性研究问题之一,是指在视频序列第一帧指定目标 后,在后续帧持续跟踪目标,即利用边界框(通常用矩形框表…

solana项目counter,测试过程中执行报错记录分享

跟随HackQuest部署counter项目,使用 Solana 官方提供的 playgroud 。这个平台让我们的部署和测试过程变得更加简便高效。 合约代码 lib.rs中复制以下代码 use anchor_lang::prelude::*; use std::ops::DerefMut;declare_id!("CVQCRMyzWNr8MbNhzjbfPu9YVvr97…

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

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

树与图的深度优先遍历(dfs的图论中的应用)

模板题 846. 树的重心 给定一颗树,树中包含 nn 个结点(编号 1∼n)和 n−1条无向边。 请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。 重心定义:重心是指树中的一个结点&#xff…

EmptyDir-数据存储

1.EmptyDir EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。 EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当…

无监督神经组合优化的扩散模型框架

文章目录 Abstract1. Introduction2. Problem Description2.1 无监督神经组合优化3. Neural Probabilistic Optimization Objective for Approximate Likelihood Models3.1 具有联合变分上界的训练扩散模型Abstract 从离散集合的不可处理分布中进行采样,而不依赖相应的训练数据…

基于Springboot的助学金管理系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 一、研究背景 利用计算机来实现助学金管理系统,已经成为一种趋势,相比传统的手工管理方式,利用软件进行助学金管理系统,有着执行快,可行性高、容量存储大,…

15.多线程概述一(下篇)

目录 1.进程与线程 2.实现多线程方式一:继承Thread类【应用】 3.实现多线程方式二:实现Runnable接口【应用】 4.实现多线程方式三:实现Callable接口【应用】 5.三种实现方式的对比与套路 6.设置和获取线程名称/线程对象【应用】 7.线程优先级…

devops的道法术器

devops的道法术器 道、法、术、器自上而下是系统思考的层次,自下而上是解决问题的层次 “道”是目标、价值观,对价值的定位。 快速交付价值,灵活响应变化,这是从价值层面的追求,或者是从第一性原理的角度来讲&#xf…

赋能企业沟通:2024年专业IM即时通讯软件的重要性不可小觑!

随着数字经济的快速发展,企业的沟通与协作方式正以前所未有的速度发生着变化。特别是在经历了全球疫情之后,远程工作和灵活办公成为了常态,而即使在疫情结束后,这种趋势也没有消退。企业对于高效、便捷、实时的沟通需求日益增长&a…

13_Python的高阶函数

高阶函数 高阶函数是Python编程中一个非常强大和有用的特性,它们允许程序员编写更简洁、更抽象的代码。 Python中的高阶函数是那些至少满足以下一个条件的函数: 接受一个或多个函数作为输入(也就是说,它的参数之一是函数&#…

EI-BISYNCH协议,欧陆2000系列设备读取数据

EI-Bisynch是一种基于ANSI X3.28-2.5 A4标准的专有协议,用于消息框架。尽管其名称中包含“Bisynch”,但它实际上是一种基于ASCII的异步协议。数据通过7位数据位、偶校验和1个停止位进行传输。 4.1 术语解释 4.1.1 地址 每个仪器都有一个可配置的地址&…