前端无感刷新token(记录–关于无感刷新Token,我是这样子做的)
这里给大家分享我在网上总结出来的一些知识 ,希望对大家有所帮助
标头 header标头是一个JSON对象 ,由两个部分组成 ,分别是令牌是类型(JWT)和签名算法(SHA256 ,RSA)
负荷部分也是一个JSON对象 ,用于存放需要传递的数据 ,例如用户的信息
此外 ,JWT规定了7个可选官方字段(建议)
属性 说明 iss JWT签发人 exp JWT过期时间 sub JWT面向用户 aud JWT接收方 nbf JWT生效时间 iat JWT签发时间 jti JWT编号签章 signature
这一部分 ,是由前面两个部分的签名 ,防止数据被篡改 。 在服务器中指定一个密钥 ,使用标头中指定的签名算法 ,按照下面的公式生成这签名数据
在拿到签名数据之后 ,把这三个部分的数据拼接起来,每个部分中间使用.来分隔 。这样子我们就生成出一个了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
下面代码分段可能会让大家阅读起来不是很顺畅 ,我直接把整份代码贴在下面 ,且每一段代码之间都添加了对应的注释
抽离代码
把上面关于调用刷新token的代码抽离成一个refreshToken函数 ,单独处理这一情况,这样子做有利于提高代码的可读性和维护性 ,且让看上去代码不是很臃肿
经过上面的逻辑抽离 ,现在看下拦截器中的代码就很简洁了 ,后续如果要调整相关逻辑直接在refreshToken.ts文件中调整即可 。
本文转载于:
https://juejin.cn/post/7170278285274775560
如果对您有所帮助 ,欢迎您点个关注 ,我会定时更新技术文档 ,大家一起讨论学习 ,一起进步。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!