nodejs之express的token验证

2020-04-14  本文已影响0人  FSYu

原文地址:https://blog.csdn.net/qq_39905409/article/details/87905335

1、用jsonwebtoken生成token
2、用express-jwt验证token是否过期或失效
3、用jsonwebtoken解析出token中的用户信息,比如用户id

注意:
使用res.json()发送响应时,在此前加一个return,
即return res.json(),类似res.send()等函数也要加return,
而且是所有的地方都要加,即使是a请求的响应没加return,
当b请求到来时,也会报错:cant’t set headers after they are sent。

报错原因: 默认多次操作res或req
1、新建token_vertify.js文件,用于封装token生成和解析函数
// token_vertify.js
var jwt = require('jsonwebtoken');
var signkey = 'mes_qdhd_mobile_xhykjyxgs'; // 密匙

exports.setToken = function(username,userid){
    return new Promise((resolve,reject)=>{
        const token = jwt.sign({
            name:username,
            _id:userid
        },signkey,{ expiresIn:'0.01h' });
        resolve(token);
    })
}

exports.verToken = function(token){
    return new Promise((resolve,reject)=>{
        var info = jwt.verify(token.split(' ')[1],signkey);
        resolve(info);
    })
}
2、在app.js中自定义一个中间件用于验证token是否过期,如果没过期,则解析出用户信息
// app.js中部分代码
var vertoken = require('./public/javascripts/token_vertify.js');
var expressJwt = require('express-jwt');

// 解析token获取用户信息
app.use(function(req, res, next) {
    var token = req.headers['authorization'];
    if(token == undefined){
        return next();
    }else{
        vertoken.verToken(token).then((data)=> {
            req.data = data;
            return next();
        }).catch((error)=>{
            return next();
        })
    }
});

//验证token是否过期并规定哪些路由不用验证
app.use(expressJwt({
    secret: 'mes_qdhd_mobile_xhykjyxgs' // 密匙
}).unless({
    path: ['/login']//除了这个地址,其他的URL都需要验证
}));

app.use(express.static(path.join(__dirname, 'public')));
app.use('/login', loginRouter);
app.use('/users', usersRouter);

//当token失效返回提示信息
app.use(function(err, req, res, next) {
    if (err.status == 401) {
        return res.status(401).send('token失效');
    }
});
3、在接口中运用上面定义的方法
// login.js文件
var express = require('express');
var router = express.Router();
var settoken = require('../public/javascripts/token_vertify.js');

// 生成token
router.post('/', function(req, res, next) {
    var username = 'slj';
    var userid = "111";
    settoken.setToken(username,userid).then((data)=>{
        return res.json({ token: data });
    })
    return next();
});

module.exports = router;
// users.js文件
var express = require('express');
var router = express.Router();

// 验证token
router.post('/vertify', function(req, res, next) {
    console.log(req.data)
    if(req.data){
        return res.json({
            msg:'身份验证成功'
        })
    }else{
        return res.json({
            msg:'未获取到用户信息'
        })
    }
    next();
});

module.exports = router;

看一下结果:

请求/login生成token并返回给客户端

在这里插入图片描述

成功验证token

在这里插入图片描述

当token失效

在这里插入图片描述
上一篇 下一篇

猜你喜欢

热点阅读