美文网首页
nodejs之express的token验证

nodejs之express的token验证

作者: FSYu | 来源:发表于2020-04-14 15:55 被阅读0次

    原文地址: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失效

    在这里插入图片描述

    相关文章

      网友评论

          本文标题:nodejs之express的token验证

          本文链接:https://www.haomeiwen.com/subject/airtvhtx.html