【Vue3项目】登录注册--双Token机制

2023-10-27

前言

最近同项目的伙伴告诉我们一个“新词汇”——双Token登录机制,emmmmm,确实没了解过,据说是在实现token长期有效的同时,防止token被第三方盗用,提高用户信息的安全性。于是,在了解了大概之后,我找了很多篇文章去学习双Token的实现过程,总结如下。

什么是双Token机制?

一般我们实现用户登录是:用户登录向服务端发送账号密码信息,登录失败返回客户端重新填写并发送用户信息;登录成功服务端生成token并返回token给客户端,客户端将token存本地。

那么问题来了,token的有效期应该是多久呢?

短期 Token:

  1. 安全性:短期 Token 更加安全,因为它们在相对较短的时间内失效,即使被泄露,攻击者的窗口期也很有限。
  2. 用户体验:短期 Token需要用户在较短的时间内重新登录,这可能会对用户的体验产生影响。用户可能需要频繁重新输入凭证,这可能会变得繁琐。
  3. 敏感操作:对于执行敏感操作的令牌,如支付、更改密码等,短期 Token 更有意义。这样即使用户忘记登出,也不会对安全性产生大的威胁。

长期 Token:

  1. 用户体验:长期 Token 可以改善用户体验,因为用户不需要频繁重新登录。这在对用户友好性方面很有价值。
  2. 资源访问频率:对于需要频繁访问资源的应用,长期 Token 可能更合适,以减少频繁的重新登录。
  3. 维护成本:长期 Token 可能需要更多的维护成本,包括处理 Token 过期、刷新 Token 等。

为了中和短期Token和长期Token出现的弊端,在实际应用中,通常使用一种混合策略来平衡这些因素,此时,就出现了双Token机制。

  • Access Token:用于获取访问资源或执行操作的授权,有效期短。客户端发送请求时,在请求头携带此accessToken。
  • Refresh Token:用来验证用户的身份,刷新accessToken,有效期长。当accessToken过期时,向服务端传递refreshToken来刷新accessToken。
    在这里插入图片描述
    其实,安全方面也会存在双token劫持,只是双token的写法能相对降低风险。

双Token的实现流程

实现思路:

  1. 用户登录向服务端发送账号密码信息,登录失败返回客户端重新填写并发送用户信息;登录成功服务端生成accessToken和refreshToken并返给客户端,客户端将token存本地。
  2. 当客户端想服务端发起请求时,在请求头携带accessToken发送给服务端,服务端验证accessToken是否过期,若未过期则正常请求数据;若过期,服务端通过code码将accessToken失效信息返回给客户端。
  3. 客户端在响应拦截器中添加拦截判断,若返回accessToken失效信息,则在请求头携带refreshToken ,重新发起请求,获取新的accessToken。
  4. 服务端验证 refreshToken 是否失效。若未过期,则重新生成accessToken返给客户端;若过期,服务端通过code码将refreshToken 失效信息返回给客户端。
  5. 客户端在响应拦截器中添加拦截判断,若返回refreshToken 失效信息,则提示用户需要重新登录,获取新的双token。
    在这里插入图片描述

实现代码:

setToken.js

// 设置
export function setToken (tokenKey, token){
    return localStorage.setItem(tokenKey,token)
}
// 获取
export function getToken (tokenKey){
    return localStorage.getItem(tokenKey)
}
// 删除
export function removeToken(tokenKey){
    return localStorage.removeItem(tokenKey)
}

request.js

import axios from 'axios';
import router from './router';
import { setToken, getToken, removeToken } from './setToken.js';

// 封装 baseURL
const request = axios.create({
	baseURL: 'http://****',
	timeout: 10000, //请求的超时毫秒数
	contentType: 'application/json',
});

// 获取refreshToken
let refreshToken = getToken('refreshToken') || "";
// 判断是否开启刷新token:不刷新
let isrefreshToken = false;
// 如果没有refreshToken(没登录||过期了),就开启刷新token
if (!getToken("refreshToken")) {
	isrefreshToken = false;
	if (!getToken('refreshToken')) {
		isrefreshToken = true;
	}
}

// 添加请求拦截器
request.interceptors.request.use((config) => {
	// 获取accessToken
	let token = getToken('accessToken');
	// 如果有token
	if (token) {
		// 并且token没过期
		if (!isrefreshToken) {
			config.headers['x-token'] = getToken('accessToken') || '';
		}
	}

	// 如果有refreshToken
	if (refreshToken) {
		// 且需要刷新token
		if (isrefreshToken) {
			config.headers['x-token'] = getToken('refreshToken');
		}
	}
	return config;
}),
	(error) => {
		return Promise.reject(error);
	};

// 添加响应拦截器
request.interceptors.response.use((response) => {
	// 对响应数据做些什么
	console.log('响应状态码', response.data.code);

	let code = response.data.code;

	// 还没有设置refreshToken请求头,需要设置一下再次发送请求
	if (!refreshToken && getToken('refreshToken') != null) {
		refreshToken = getToken('refreshToken');
		return request(response.config);
	}

	if (code == 401 || code == 1021) {
		//accessToken过期了,需要带着refreshToken,去换取新的token
		refreshToken = getToken('refreshToken');
		isrefreshToken = true;
		// 相当于重新走一遍刚刚的请求
		return request(response.config);
	}

	if (code == 1024) {
		setToken('accessToken', response.data.data);
		isrefreshToken = false;
		return request(response.config);
	} else if (code == 1023) {

		// 将本地token删除
		removeToken('refreshToken');
		removeToken('accessToken');
		// 跳转到登录页面,重新登录
		router.push('/login');
		//返回信息,让用户重新登录
		isrefreshToken = true;
		alert('登录已超期,请重新登录');
	}

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

// 向外暴露 request
export default request;

可能理解的不够全面,请批评指正!

推荐学习文章:
前端双token策略(uniapp-vue3-ts版)
基于OAuth2.0的refreshToken前端刷新方案与演示demo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Vue3项目】登录注册--双Token机制 的相关文章

  • document.execCommand('copy') 有大小限制吗?

    我使用的 document execCommand copy 与此处描述的类似 https developers google com web updates 2015 04 cut and copy commands https deve
  • 使用 javascript 将 CSS 类添加到具有另一个类名的所有元素

    我正在尝试使用 javascript 将类添加到具有不同类的所有元素 我知道你可能认为这是多余的 但对于我所处的情况来说这是必要的 我需要一种方法来查看具有该类名称的所有元素并添加该类 但我不明白如何获取计数 我正在使用一个 cms 但我无
  • goJS 下拉菜单删除项目

    我有简单的 python Flask goJS 图形应用程序 如下所示 节点和链接文本的源是从应用程序的后端加载的 我将它们设置为model modelData像这样的部分 var graphDataString JSON parse di
  • 普通 JSON 到 GraphSON 格式

    我有两个问题 我在哪里可以真正找到 GraphSON 文件的基本格式 保证 gremlin 控制台成功加载 我正在尝试将 JSON 大约有 10 20 个字段 转换为另一个可以由 gremlin 查询的文件 但我实际上找不到有关 graph
  • React:如何从 Material-UI TextField 组件获取值

    我有一个小型应用程序 其中包含 Form 组件 SubmitButton 组件和我的父组件 App js 当用户单击提交按钮时 我想获取表单组件上 3 个字段的值并将它们传递给我的 App js 组件 我不确定如何使用触发事件onClick
  • ReactJS 中的组件之一出现“必须返回有效的 React 元素(或 null)”错误

    我的代码是这样的 var data id 1 taskName Pete Hunt standarDescription This is one comment emplComment meaaow I am meeawo empRatin
  • NodeJS Express 中每个请求的全局范围

    我有一个基本的快速服务器 需要在每个请求处理期间存储一些全局变量 更深入地说 请求处理涉及许多需要存储在变量中的操作 例如global transaction 当然 如果我使用global范围 每个连接都将共享其事务的信息 并且我需要一个全
  • jqGrid如何将额外的类应用于标题列

    我想在特定列上应用一个额外的类 我知道通过在 colModel 中指定这一点对于行是可能的 但这些类仅应用于 结果行 中的列 而不应用于标题 我想要达到的是通过简单的类名隐藏较小视口的特定列 与 Twitter Bootstrap 一起使用
  • 在 Javascript 中按日期对数组进行排序

    我在用着sort 按日期排序数组 elements data sort function a b return a date getTime b date getTime 问题是某些元素缺少日期 或日期无效 这导致了这个错误 无法读取属性
  • 窗口对象没有创建它的页面附加的属性

    我用window open url target 开一个url在新选项卡 窗口中 在此之前 我在新打开的窗口对象上设置了一些属性 目的是将数据从该页面 新窗口的创建者 传递到新创建的窗口 在除 Internet Explorer 之外的所有
  • 如何配置 StrongLoop LoopBack MongoDB 数据源以部署到 Heroku

    我正在使用 LoopBack 版本 1 6 并使用以下数据源配置运行本地 mongoDB 服务器进行开发 mongodb defaultForType mongodb connector loopback connector mongodb
  • 从右到左的语言和编程问题

    我正在创建一个网络文本编辑器 它使用我创建的新语言 如 BBcode 这种标记语言将采用阿拉伯语 但我面临这些问题 在所有 IDE 和编辑器中将英语和阿拉伯语文本混合在同一行中确实很困难 因为会发生奇怪的事情 单词和字符的顺序发生变化 使用
  • 是否存在必须在 HTML/JavaScript 中使用早期绑定/内联事件属性的情况

    在我对以下问题的回答中 事件绑定是什么意思 https stackoverflow com q 6329996 144491 我顺便说一下 使用 inline JavaScript Early Binding 来绑定 JavaScript
  • 添加 sigma.js 导航按钮

    我是 javascript 和 sigma js 的新手 我试图让导航按钮在画布中向上 向下 向左 向右滚动 就像发现的那样here http jcml fr jacomyal osdc2012 demo 到目前为止 我有一个简单的例子 我
  • 未捕获错误:找不到从“ui/app”loader.js 导入的模块“ember”:164

    我使用以下命令构建并提供我的 ember 应用程序 ember build ember serve 两者都按预期工作 然后我转到以下 localhost 4200 URL 查看应用程序 并在 javascript 控制台中看到以下错误 Un
  • JavaScript IDE/编译器

    现在 我希望你们中的一些人能够理解我的要求 我是编程新手 我在 Codecademy com 上了解了 JavaScript 我使用 labs codecademy com 来编写 JavaScript 但它有限制 对于编程新手来说 我可以
  • 加密 Chrome 扩展程序?

    无论如何 要加密 Chrome 扩展程序 以免暴露源代码 您可以使用混淆器隐藏您的代码 市场上有很多可用的 像Google Closure编译器这样的工具很少 而且市场上有很多在线javascript ofuscators 你可以使用任何一
  • 如何自动加载 Webpack 中给定目录中的所有 JSON 文件? [复制]

    这个问题在这里已经有答案了 编辑 有一个现有的问题 https stackoverflow com questions 29421409 how to load all files in a subdirectories using web
  • jQuery() 与 jQuery.parseHtml() 空格语法错误

    我有一行 javascript 导致 jQuery 中出现语法错误 document find Container replaceWith data find Content 代码本身如果相当无害的话 它所做的只是从 ajax 调用获取响应
  • Bootstrap $('#myModal').modal('show') 不起作用

    我不知道为什么 但所有模态功能都不适用于我 我检查了版本和负载 它们都很好 我不断收到此错误消息 Uncaught TypeError modal is not a function 对于隐藏我已经找到了替代方案 代替 myModal mo

随机推荐

  • 定时任务-quartz的使用,实现可页面化管理

    定时任务 quartz的使用 实现可页面化管理 使用spring quartz实现定时任务的页面化管理 主要特点 1 时间表达式等信息配置在数据库中 从而实现页面化管理 2 可以手动执行或者停止单个任务 也可以使一个任务加入或者移出自动运行
  • unity 渲染流水线

    渲染流水线 主要分为应用阶段 几何阶段 光栅化阶段 应用阶段 这一阶段最重要的输出是渲染所需的几何信息 即渲染图元 几何阶段 重要任务就是把顶点坐标变换到屏幕空间 通过对输入的渲染图元进行多次处理后 输出屏幕空间的二维顶点坐标 每个顶点对应
  • 《大话数据结构》第六章树

    1 定义 之前我们一直在谈的是一对一的线性结构 可现实中 还有很多一对多的情况需要处理 所以我们需要研究这种一对多的数据结构 树 考虑它的各种特性 来解决我们在编程中碰到的相关问题 树 Tree 是n n 0 个结点的有限集 n 0时称为空
  • R语言中的函数18:readxl::read_excel(), read_xls(),read_xlsx()

    文章目录 read excel read xls 和read xlsx 函数介绍 实例 实例1利用read xls读取文件 实例2指定读取数据的范围range 实例3读取有缺失值的数据 实例4read xls和read xlsx需要对应的文
  • vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制

    一 定义 nextTick 事件循环 nextTick的由来 由于VUE的数据驱动视图更新 是异步的 即修改数据的当下 视图不会立刻更新 而是等同一事件循环中的所有数据变化完成之后 再统一进行视图更新 nextTick的触发时机 在同一事件
  • 什么?计算机居然不能精确计算0.1+0.2?

    小云今年大三在一家互联网公司实习 今天下班回到寝室闷闷不乐 小帅见状关心到 怎么了 碰到什么不开心的事了吗 小云叹了口气 今天我写的程序中涉及到小数计算 出了个bug 被测试的人笑了 说我居然0 1 02都不会算 小帅忍不住笑了 0 1 0
  • Java之JVM方法区、永久代、元空间、常量池简介说明

    转自 Java之JVM方法区 永久代 元空间 常量池简介说明 下文笔者讲述jvm中方法区 永久代 元空间 常量池的简介说明 如下所示 JVM内存模型简介 jvm堆是所有线程共享的 主要用来存储对象 堆 年轻代和老年代两块区域 使用NewRa
  • 安时积分法计算soc程序_BMS(电池管理系统)第四课——核心!!!SOC算法开发...

    SOC基本定义 Qmax 电池最大允许充放电容量 可理解为额定容量 SOH Ieff 充放电电流或自放电电流 充电为负 充放电的库伦效率 目前行业算法方案列表如下 其中安时积分 开路电压 人工神经网络 卡尔曼滤波四中方案通用性比较高 重点介
  • 【论文解读-未完成】-A Survey of Transformers-【一篇论文了解整个Transformers王国】

    论文链接 https arxiv org abs 2106 04554 论文时间 202106 论文单位 复旦大学 论文长度 40页 论文目录 A Survey of Transformers Transformers的文献综述 1 INT
  • 自动化测试框架总结

    自动化测试框架流程图 自动化测试框架模块 配置文件读取模块 日志模块 测试数据读取模块 测试执行模块 测试结果更新模块 异常处理模块 屏幕截图模块 自动化框架模块功能说明 配置文件读取模块 模块的主要功能是把测试项目的公共配置读取到脚本里
  • 智能家居_串口通信编程

    模拟串口 我要使用串口开发 那么 安卓系统必须要Root 让我有超级权限 串口就是文件 首先要打开串口文件 我们没有实体开发主板 使用虚拟串口驱动来代替实体开发主板 模拟android主板上的2个串口 模拟 开发板 插入了电脑 电脑就会显示
  • 2020东南大学网络空间安全保研夏令营(预推免)经验

    2020东南大学网安院保研夏令营 预推免 经验 前言 个人情况 本科某双非双一流CS专业 GPA 1 230 国家级省级奖项各有四五项 校级奖项若干 奖学金若干 项目只有一个大创 无论文 东大网安院说来话长 本来是不想报的 然鹅计算机学院的
  • mavne install 报错org.apache.maven.surefire.util.SurefireReflectionException: java.lang.reflect.Invoca...

    maven install 报错 org apache maven surefire util SurefireReflectionException java lang reflect InvocationTargetException
  • java校验文件路径正则表达式_正则表达式判断是否是合法路径

    在页面前端使用一个文本框 输入条件是 c test 在java中File判断是可以通过的 可以创建的 File file new File filePath if file exists file mkdir 说明是一个合法的路径 但是在w
  • 哈师大计算机学院宿舍,新生攻略

    原标题 新生攻略 哈师大所有的 秘密 都在这了 你好 我是哈师大17级的新生 我想全面的了解一下咱们学校 应该去哪了解呀 这你可算是问对人了 听说最近哈尔滨师范大学学生会的官方微信平台出了非常全的新生攻略呢 快关注它们的公众号 hsdxsh
  • Linux系列

    测试代码如下 是一个输出 Tinywan字符串与循环轮数的死循环程序 每输出一行就休眠1秒 原始输出 前台执行该程序运行效果 程序每隔一秒会在终端输出一个字符串 此时如果键入 Ctrl C 程序会收到一个 SIGINT信号 如果不做特殊处理
  • APT 攻击溯源方法

    概述 当今世界正值百年未有之大变局 网络空间成为继陆 海 空 天之后的第五大疆域 安全威胁也随之延伸至网络空间 没有网络安全就没有国家安全 在新时代网络空间安全已经上升至国家安全的高度 高级持续性威胁 Advanced Persistent
  • #PCIE# PCIE基础知识篇(3)

    写在前面 本文章转载自老狼知乎 感谢分享 随着AMD新一代CPU的发布 PCIe 4 0 Gen4 也进入了人们的视线 然而Intel随后宣传PCIe 4 0对消费市场用处不大 AMD则反讽Intel吃不到葡萄说葡萄酸 正在吃瓜群众搬板凳看
  • could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the n

    如果你在创建自定义网络时 docker network create driver bridge my net出现下面的提示 Error response from daemon could not find an available no
  • 【Vue3项目】登录注册--双Token机制

    目录 前言 什么是双Token机制 双Token的实现流程 前言 最近同项目的伙伴告诉我们一个 新词汇 双Token登录机制 emmmmm 确实没了解过 据说是在实现token长期有效的同时 防止token被第三方盗用 提高用户信息的安全性