Express 双token认证 实现无感刷新token

相信兄弟们在写项目时,都必须要考虑用户信息安全的一个问题,那么这时候大多数兄弟选择使用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有一个大概的理解。

  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值