最新要闻
- 【环球热闻】3月1日广东男篮主场见 威姆斯晒登机照:回家
- 焦点资讯:美国高中地下发现加密货币矿场 7个月耗电费12万元
- 直屏手机为何越来越多了?原因有三个
- 新资讯:近250家公司用ChatGPT取代员工:过半考核优秀 能省10万美元
- 环球滚动:诺基亚60年首次更换Logo后:手机品牌继续沿用经典蓝底Logo
- 环球快报:比老司机还稳!特斯拉主动安全压线避让变道前车:车主惊叹
- 天天头条:三睾拟双身虫
- 世界新动态:八代将军吉宗下载_八代将军吉宗
- 女子驾奇瑞小蚂蚁 高速上油门到底车速为0!4S店:退款退车
- 世界速看:暴雪联合时尚品牌推出《暗黑4》主题女装:这画风太诡异了
- 焦点播报:董明珠:格力员工一人一套房承诺不变
- 个人私生活被恶搞辣眼?董明珠:有些自媒体为了赚钱不择手段 低级下流无聊
- 一文看懂小米无线AR眼镜探索版:自研微手势 隔空就能刷抖音
- 世界看热讯:流氓APP再见!26条新规严管移动应用:不得欺骗误导用户
- Win11 22H2“Moment 2”更新快了:将在未来几周推送
- 每日讯息!男子醉驾被查也不让新手妻子开车:为了不要出现更大的事故
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
焦点速递!记录--关于无感刷新Token,我是这样子做的
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
什么是JWT
JWT
是全称是JSON WEB TOKEN
,是一个开放标准,用于将各方数据信息作为JSON格式进行对象传递,可以对数据进行可选的数字加密,可使用RSA
或ECDSA
进行公钥/私钥签名。
使用场景
JWT
最常见的使用场景就是缓存当前用户登录信息,当用户登录成功之后,拿到JWT
,之后用户的每一个请求在请求头携带上Authorization
字段来辨别区分请求的用户信息。且不需要额外的资源开销。
(资料图)
相比传统session的区别
比起传统的session
认证方案,为了让服务器能识别是哪一个用户发过来的请求,都需要在服务器上保存一份用户的登录信息(通常保存在内存中),再与浏览器的cookie
打交道。
- 安全方面 由于是使用
cookie
来识别用户信息的,如果cookie
被拦截,用户会很容易受到跨站请求伪造的攻击。 - 负载均衡 当服务器A保存了用户A的数据之后,在下一次用户A服务器A时由于服务器A访问量较大,被转发到服务器B,此时服务器B没有用户A的数据,会导致
session
失效。 - 内存开销 随着时间推移,用户的增长,服务器需要保存的用户登录信息也就越来越多的,会导致服务器开销越来越大。
为什么说JWT不需要额外的开销
JWT
为三个部分组成,分别是Header
,Payload
,Signature
,使用.
符号分隔。
// 像这样子xxxxx.yyyyy.zzzzz
标头 header
标头是一个JSON
对象,由两个部分组成,分别是令牌是类型(JWT
)和签名算法(SHA256
,RSA
)
{ "alg": "HS256", "typ": "JWT"}
负荷 payload
负荷部分也是一个JSON
对象,用于存放需要传递的数据,例如用户的信息
{ "username": "_island", "age": 18}
此外,JWT规定了7个可选官方字段(建议)
属性 | 说明 |
---|---|
iss | JWT签发人 |
exp | JWT过期时间 |
sub | JWT面向用户 |
aud | JWT接收方 |
nbf | JWT生效时间 |
iat | JWT签发时间 |
jti | JWT编号 |
签章 signature
这一部分,是由前面两个部分的签名,防止数据被篡改。 在服务器中指定一个密钥,使用标头中指定的签名算法,按照下面的公式生成这签名数据
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
在拿到签名数据之后,把这三个部分的数据拼接起来,每个部分中间使用.
来分隔。这样子我们就生成出一个了JWT
数据了,接下来返回给客户端储存起来。而且客户端在发起请求时,携带这个JWT
在请求头中的Authorization
字段,服务器通过解密的方式即可识别出对应的用户信息。
JWT优势和弊端
优势
- 数据体积小,传输速度快
- 无需额外资源开销来存放数据
- 支持跨域验证使用
弊端
- 生成出来的
Token
无法撤销,即使重置账号密码之前的Token
也是可以使用的(需等待JWT过期) - 无法确认用户已经签发了多少个
JWT
- 不支持
refreshToken
关于refreshToken
refreshToken
是Oauth2
认证中的一个概念,和accessToken
一起生成出来的。
当用户携带的这个accessToken
过期时,用户就需要在重新获取新的accessToken
,而refreshToken
就用来重新获取新的accessToken
的凭证。
为什么要有refreshToken
当你第一次接触的时候,你有没有一个这样子的疑惑,为什么需要refreshToken
这个东西,而不是服务器端给一个期限较长甚至永久性的accessToken
呢?
抱着这个疑惑我在网上搜寻了一番,
其实这个accessToken
的使用期限有点像我们生活中的入住酒店,当我们在入住酒店时,会出示我们的身份证明来登记获取房卡,此时房卡相当于accessToken
,可以访问对应的房间,当你的房卡过期之后就无法再开启房门了,此时就需要再到前台更新一下房卡,才能正常进入,这个过程也就相当于refreshToken
。
accessToken
使用率相比refreshToken
频繁很多,如果按上面所说如果accessToken
给定一个较长的有效时间,就会出现不可控的权限泄露风险。
使用refreshToken可以提高安全性
用户在访问网站时,
accessToken
被盗取了,此时攻击者就可以拿这个accessToke
访问权限以内的功能了。如果accessToken
设置一个短暂的有效期2小时,攻击者能使用被盗取的accessToken
的时间最多也就2个小时,除非再通过refreshToken
刷新accessToken
才能正常访问。设置
accessToken
有效期是永久的,用户在更改密码之后,之前的accessToken
也是有效的
总体来说有了refreshToken
可以降低accessToken
被盗的风险
关于JWT无感刷新TOKEN方案(结合axios)
业务需求
在用户登录应用后,服务器会返回一组数据,其中就包含了accessToken
和refreshToken
,每个accessToken
都有一个固定的有效期,如果携带一个过期的token
向服务器请求时,服务器会返回401的状态码来告诉用户此token
过期了,此时就需要用到登录时返回的refreshToken
调用刷新Token
的接口(Refresh
)来更新下新的token
再发送请求即可。
话不多说,先上代码
工具
axios
作为最热门的http
请求库之一,我们本篇文章就借助它的错误响应拦截器来实现token
无感刷新功能。
具体实现
本次基于axios-bz代码片段封装响应拦截器 可直接配置到你的项目中使用 ✈️ ✈️
利用interceptors.response
,在业务代码获取到接口数据之前进行状态码401
判断当前携带的accessToken
是否失效。 下面是关于interceptors.response
中异常阶段处理内容。当响应码为401时,响应拦截器会走中第二个回调函数onRejected
下面代码分段可能会让大家阅读起来不是很顺畅,我直接把整份代码贴在下面,且每一段代码之间都添加了对应的注释
// 最大重发次数const MAX_ERROR_COUNT = 5;// 当前重发次数let currentCount = 0;// 缓存请求队列const queue: ((t: string) => any)[] = [];// 当前是否刷新状态let isRefresh = false;export default async (error: AxiosError) => { const statusCode = error.response?.status; const clearAuth = () => { console.log("身份过期,请重新登录"); window.location.replace("/login"); // 清空数据 sessionStorage.clear(); return Promise.reject(error); }; // 为了节省多余的代码,这里仅展示处理状态码为401的情况 if (statusCode === 401) { // accessToken失效 // 判断本地是否有缓存有refreshToken const refreshToken = sessionStorage.get("refresh") ?? null; if (!refreshToken) { clearAuth(); } // 提取请求的配置 const { config } = error; // 判断是否refresh失败且状态码401,再次进入错误拦截器 if (config.url?.includes("refresh")) { clearAuth(); } // 判断当前是否为刷新状态中(防止多个请求导致多次调refresh接口) if (!isRefresh) { // 设置当前状态为刷新中 isRefresh = true; // 如果重发次数超过,直接退出登录 if (currentCount > MAX_ERROR_COUNT) { clearAuth(); } // 增加重试次数 currentCount += 1; try { const { data: { access }, } = await UserAuthApi.refreshToken(refreshToken); // 请求成功,缓存新的accessToken sessionStorage.set("token", access); // 重置重发次数 currentCount = 0; // 遍历队列,重新发起请求 queue.forEach((cb) => cb(access)); // 返回请求数据 return ApiInstance.request(error.config); } catch { // 刷新token失败,直接退出登录 console.log("请重新登录"); sessionStorage.clear(); window.location.replace("/login"); return Promise.reject(error); } finally { // 重置状态 isRefresh = false; } } else { // 当前正在尝试刷新token,先返回一个promise阻塞请求并推进请求列表中 return new Promise((resolve) => { // 缓存网络请求,等token刷新后直接执行 queue.push((newToken: string) => { Reflect.set(config.headers!, "authorization", newToken); // @ts-ignore resolve(ApiInstance.request >(config)); }); }); } } return Promise.reject(error);};
抽离代码
把上面关于调用刷新token
的代码抽离成一个refreshToken
函数,单独处理这一情况,这样子做有利于提高代码的可读性和维护性,且让看上去代码不是很臃肿
// refreshToken.tsexport default async function refreshToken(error: AxiosError) { /* 将上面 if (statusCode === 401) 中的代码贴进来即可,这里就不重复啦 代码仓库地址: https://github.com/QC2168/axios-bz/blob/main/Interceptors/hooks/refreshToken.ts */}
经过上面的逻辑抽离,现在看下拦截器中的代码就很简洁了,后续如果要调整相关逻辑直接在refreshToken.ts
文件中调整即可。
import refreshToken from "./refreshToken.ts"export default async (error: AxiosError) => { const statusCode = error.response?.status; // 为了节省多余的代码,这里仅展示处理状态码为401的情况 if (statusCode === 401) { refreshToken() } return Promise.reject(error);};
本文转载于:
https://juejin.cn/post/7170278285274775560
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
焦点速递!记录--关于无感刷新Token,我是这样子做的
热点!如何使用appuploader制作apple证书
世界热资讯!JMeter的基础认识
【环球热闻】3月1日广东男篮主场见 威姆斯晒登机照:回家
【天天报资讯】Redis 缓存过期策略和内存淘汰策略
环球热头条丨【复盘】搭建日志平台的复盘与思考
天天微动态丨sed命令的使用(替换)
环球实时:软件工程阅读笔记
Android ADB 备忘清单_开发速查表分享
焦点资讯:美国高中地下发现加密货币矿场 7个月耗电费12万元
直屏手机为何越来越多了?原因有三个
新资讯:近250家公司用ChatGPT取代员工:过半考核优秀 能省10万美元
环球滚动:诺基亚60年首次更换Logo后:手机品牌继续沿用经典蓝底Logo
环球快报:比老司机还稳!特斯拉主动安全压线避让变道前车:车主惊叹
天天头条:三睾拟双身虫
Prometheus插件安装(mysql_exporter)
消息!河南农信社数字化转型实践方案
今日讯!剑指 Offer 55 - I. 二叉树的深度(java解题)
世界新动态:八代将军吉宗下载_八代将军吉宗
女子驾奇瑞小蚂蚁 高速上油门到底车速为0!4S店:退款退车
世界速看:暴雪联合时尚品牌推出《暗黑4》主题女装:这画风太诡异了
焦点播报:董明珠:格力员工一人一套房承诺不变
个人私生活被恶搞辣眼?董明珠:有些自媒体为了赚钱不择手段 低级下流无聊
一文看懂小米无线AR眼镜探索版:自研微手势 隔空就能刷抖音
数据结构刷题2023.02.27小记
天天即时看!Ubuntu-深度学习环境搭建(yolov3)
焦点滚动:学习swoole之前,你需要知道的几件事
世界看热讯:流氓APP再见!26条新规严管移动应用:不得欺骗误导用户
Win11 22H2“Moment 2”更新快了:将在未来几周推送
每日讯息!男子醉驾被查也不让新手妻子开车:为了不要出现更大的事故
【全球新要闻】为迎接中国游客!韩国旅游业也是拼了:推中文菜单、背汉语、招募中文职员
手一抖被迫看广告!工信部通知:禁止高灵敏度“摇一摇”
当前资讯!宜兴购房补贴本科生可以申请吗?
焦点关注:ChatGPT的隐私安全问题及隐私保护技术
无关风月是什么意思?无关风月我题序等你回是什么歌?
小盆友是什么意思?小盆友生日祝福成语有哪些?
这款MOD可以让《原子之心》双子舞伶露脸:好看吗?
天天播报:中兴发布小方糖路由器:双千兆设计 首发99元
考验信仰、财力的时候到了!丰田加价神车新一代埃尔法曝光
13代酷睿CPU热卖 Intel承诺员工薪酬会涨回来:基本工资100%满血
每日消息!形似比亚迪仰望U8 奇瑞捷途旅行者官图发布:保时捷前总监操刀
电视剧红狐荣乡君是什么人?红狐电视剧演员表介绍
刻在我心底的名字是哪部电影的主题曲?刻在我心底的名字歌词是什么?
win7快速启动栏在哪里?win7快速启动栏怎么使用?
东芝ac100怎样刷系统?东芝ac100安卓笔记本多少钱?
超长待机智能手机有哪些?超长待机智能手机排行榜
三星GALAXY i5700什么时候上市的?三星GALAXY i5700怎么关机?
世界热头条丨谷歌邮箱注册
环球观察:Prometheus插件安装(NodeExporter)
焦点热讯:Redis高频面试题总结
速读:财政部:截至1月末,全国地方政府债务余额357018亿元
聚焦:威马员工在线讨薪 吉利副总裁:我这里缺人、可以考虑下
全球看点:一箱油续航轻松破千公里 五菱凯捷混动铂金版上市:12.98万起
摩托罗拉rizr纵向卷轴屏手机亮相:屏幕可伸长
国内能买到!ZERO SR-X概念电动摩托发布:110马力、能跑300公里
当前关注:送冰极洁面霜:妮维雅男士控油补水洗面奶24.9元大促
天天热推荐:Mysql 自定义目录安装
世界资讯:武汉Java培训班哪家好?大家都要怎么挑选
全球速看:SQL行转列、列转行(SQL Server版)
世界视点!南京Java培训班哪家好,什么样的可选
什么是潮吹
担心的事儿发生了:已有企业在用ChatGPT取代员工
每日热门:iPhone 15 Pro Max与14 Pro Max对比:明显更厚了!妥妥半斤机
纳智捷当街加油 车主现身说法:从郑州到广州加了5次
环球速递!半价大促:五芳斋豆沙青团6枚9.9元发车 清甜绵软
全球最早上映!任天堂《超级马力欧兄弟》大电影内地定档4月5日
世界最新:总结SpringBoot1.x迁移到2.x需要注意的问题
全球短讯!Spring Boot 实现日志链路追踪,无需引入组件,让日志定位更方便!
代理设计模式还不会?2分钟搞定
【世界报资讯】河南省通许县:“中国酸辣粉之都”正式揭牌
天天热门:微信下重拳:上万个群被封杀 此类行为千万别做
环球微头条丨程序员20年喝近2吨可乐屡患结石 几乎天天喝
联想推ThinkPad Z16 Gen 2笔记本:锐龙7000系列 可选4K+屏
双子姐妹、冰箱很带感 《原子之心》游戏已被破解:俄罗斯自己黑客干的
还敢生吃?日本即将核污水倒入大海 降低水产品氚活度分析精度
世界观天下!老外首次用上徕卡影像!小米13/Pro国际版发布:999欧元起
全球看热讯:9岁女演员获柏林电影节最佳主角:史上最年轻获奖者
今日热门!高三女生因百日誓师热血发言表情被网暴 父亲怒回应:我们的骄傲 请尊重
《流浪地球2》导演郭帆让学生们不要用ChatGPT写作业:老师分辨不出来
读Java性能权威指南(第2版)笔记03_ Java SE API技巧中
美国铁路烂到家:“毒列车公司”再次发生脱轨事故 问题没法解决
【世界速看料】昔日手机巨头换新!诺基亚换全新Logo 刷新认识:网友直呼爷青结
每日热议!残损货币及不宜流通货币常识_不宜流通人民币与残损币区别
AMD RX 7900显卡价格在中国崩盘了!两个月暴跌1400元
世界滚动:不完整的爱情
每日动态!怎样提高空间想象能力 如何提高空间想象能力
全球速看:量化交易基础 - 10 - 拟合
全球速读:Kafka简单介绍和安装
当前快讯:委员蒋胜男建议对8小时工作制加强监督:你一天干几小时?
CentOS7安装nvm和node
局域网实现PC、Pad、Android互联
世界速讯:三大范式
项目中并发修改可能存在的问题
环球快资讯:暴力涡轮风扇RTX 4090再次现身:噪音令人崩溃
全球快讯:国产本田E?众泰江南U2纯电轿车正式上市:5.88万起
今亮点!“中国蛇王”凉了?老牌国货隆力奇人去楼空”上热搜 曾连续11年全国销量第一
今日热闻!Java面向对象进阶第四天(常用API)
Codeforces Global Round 15 CF1552 A~G 题解
每日热文:八方点赞!姆巴佩、莫德里奇等多人点赞C罗社媒动态
世界快报:零下50℃室外玩电脑 显卡都冻傻了:核心温度167万摄氏度