koa如何进行token设置和进行token过期验证

发布于:2023-01-02 ⋅ 阅读:(464) ⋅ 点赞:(0)

一,安装包文件

npm i jsonwebtoken

二,通过jsonwebtoken设置token 

 const jwt = require('jsonwebtoken')
    // 创建token
let token = jwt.sign(obj,secret,opt)
    //解码token
let payload = jwt.verify(token,secret)

三,实现思路

login

当我们收到前台传来的帐号密码查库比对通过后,创建token并返回客户端

// 登录接口login
router.post('/login', async ctx => {
    const { email, password } = ctx.request.body
    const findRelut = await User.find({ email })
    if (findRelut.length > 0) {
        //  验证密码
        const result = bcrypt.compareSync(password, findRelut[0].password);
        console.log(result);
        if (result) {
            // 返回token
            let payload = { password, time: new Date().getTime(), timeout: 1000 * 60 * 60 * 2 }
            let token = jwt.sign(payload, "screct");
            ctx.status = 200
            ctx.body = {
                message: '登录成功',
                token: token
            }
        } else {
            ctx.status = 400
            ctx.body = {
                message: '密码错误重新登录'
            }
        }
    } else {
        ctx.status = 404
        ctx.body = {
            message: '用户不存在,请先注册'
        }
    }
})

四,如何进行token校验

1.创建checkToken.js文件

const jwt = require('jsonwebtoken')
async function check(ctx, next) {
    // split('?')[0]把字符串分割成字符串数组——拿到url值
    let url = ctx.url.split('?')[0]
    // 如果是登陆页面和注册页面就不需要验证token了
    if (url === '/api/users/login' || url === "/api/users/login") {
        await next()
    } else {
        //获取到token
        let token = ctx.request.headers["authorization"].spilt('Bearer ')[1]
        if (token) {
            //  如果有token的话解析
            const tokenItem = jwt.verify(token, 'screct')
            //    把创建时间和过期时间析构出来
            const { time, timeout } = tokenItem
            // 拿到当前时间
            let NewTime = new Date.getTime()
            if (NewTime - time <= timeout) {
                // 说明没过期
                await next()
            } else {
                ctx.body = {
                    status: 405,
                    message: '请带上token'
                }
            }
        } else {
            ctx.body = {
                status: 405,
                message: 'token 已过期,请重新登陆'
            }
        }
    }
}
module.exports = check

 2.参数说明:

iss: 签发者
sub: 面向用户
aud: 接收者
iat(issued at): 签发时间
exp(expires): 过期时间
nbf(not before):不能被接收处理时间,在此之前不能被接收处理
jti:JWT ID为web token提供唯一标识

例如
{"sub":"subject","aud":"sina.com","iss":"baidu.com","iat":1528360628,"nbf":1528360631,"jti":"253e6s5e","exp":1528360637}

3.jwt.sign(object,key)说明

两个参数分别是签名算法和自定义的签名Key(盐)。签名key可以byte[] 、String及Key的形式传入。前两种形式均存入builder的keyBytes属性,后一种形式存入builder的key属性。如果是第二种(及String类型)的key,则将其进行base64解码获得byte[] 。

五、在app.js入口中注用

const checkToken = require('./middleware/checkToken.js')
	
// 验证token的中间件函数
	
app.use(checkToken)

本文含有隐藏内容,请 开通VIP 后查看