相信兄弟们在写项目时,都必须要考虑用户信息安全的一个问题,那么这时候大多数兄弟选择使用token来保护用户信息。
但是又对token所设置的时间拿捏不准
token设置的时间长了,那么我们设置token的意义也就消失了,数据还是会被不法分子拦截、劫持。
token设置的时间短了,虽然说保障了我们用户的信息安全,但是在用户使用的过程中,token已过期就会需要我们用户重新登录,造成用户的体验感很差。
在这时候我们就要考虑,如何在确保用户信息安全的情况下,让用户有一个良好的体验呢?
如果我们设置两个token(一个长token,一个短token)是不是就可以解决这个问题了呢?
也就是本次要讲的双token(双JWT)认证了。
双token的原理也很简单:
- 通过定义两个token,长token(Refresh Token)和短token(Access Token)
- 在用户登录完成之后后端则会生成双token,并且将短token(Access Token)返回到前端用于数据的请求。
- 而长token(Refresh Token)则会留在后端,用于短token(Access Token)过期之后获取新的短token。
双token认证主要就是为了解决:
1、设置单token时,不安全容易被劫持,导致用户信息泄露的问题。
2、单token过期用户需要重新登录,降低用户体验。
3、降低对服务器的负载等问题的。
那么说了这么多,又如何实现双token认证呢?
1、在我们使用express后端创建token时,首先就是下载jsonwebtoken的node包
npm i jsonwebtoken
2、接下来呢就是在我们需要使用jsonwebtoken的文件中,导入我们的jsonwebtoken包
这里我们首先创建了一个文件夹用于存放我们的token.js文件方便我们后续的使用
然后就是在我们新创建的token.js文件中导入我们下载好的包
const jwt = require('jsonwebtoken')
3、当我们基础配置完成之后就该,创建我们的token了
首先就是定义三个常量方便后续定义token使用
这里我们的密钥是随便输的,在我们实际的开发中,可以根据我们的需求传入
// 定义密钥,可以根据需求修改
const secret = 'asdasdsadsxzc'
// 定义短token过期时间
const accessTokenTime=20
// 定义长token过期时间
const refreshTokenTime = 60*60*24
其次就是根据我们定义好的常量,创建两个token
// 定义短Token
const setAccessToken=(user={})=>{
return 'Bearer ' + jwt.sign(user,secret,{expiresIn:accessTokenTime})
}
// 定义长Token
const setRefreshToken=(user={})=>{
return 'Bearer ' + jwt.sign(user,secret,{expiresIn:refreshTokenTime})
}
4、创建完双token之后,也就到了我们最重要的一步,双token的验证
这里是对短token的一个认证
// 验证短token是否过期
const testAccessToken=(token)=>{
let code = 200
if(!token){
return{
code:401,
msg:'未登录或token不存在'
}
}
jwt.verify(token,secret,(err,data)=>{
if(err){
if(err.message == 'invalid token'){
code = 402
msg = '无效的token'
return
}
if(err.message == 'jwt expired'){
code = 402
msg = 'token过期'
return
}
code = 402
msg = '未知token错误'
return
}
code = 200
msg = '有效的token'
return
})
return{
code,
msg
}
}
这里则是对长token的认证
// 验证长token是否过期
const testRefreshToken=(token,user)=>{
let code = 200
let newtoken = ''
jwt.verify(token,secret,(err,data)=>{
if(err){
if(err.message == 'invalid token'){
code = 402
msg = '无效的token'
return
}
if(err.message == 'jwt expired'){
code = 402
msg = 'token过期'
return
}
code = 402
msg = '未知token错误'
return
}
code = 200
msg = '有效的token'
newtoken = setAccessToken(user)
return
})
return{
code,
msg,
newtoken
}
}
4、当我们的token认证配置完成后一定不能忘了最重要的一步,那就是将属性和方法导出
module.exports={
setAccessToken, // 定义短Token
setRefreshToken, // 定义长Token
testAccessToken, // 验证短token是否过期
testRefreshToken // 验证长token是否过期
}
这样就完成了我们token.js的配置了,后续在使用中导入我们的token.js文件直接使用方法即可。
总结:
双token的机制其实不难理解,相信以兄弟们的脑子一定是能够比我有更好的理解的。
以上就是我本章要分享的内容了,写的不好请见谅,希望通过本章,可以让你对双token有一个大概的理解。