JWT 不适用于快速路由器

JWT not working with express router

我正在尝试为 express REST API 实施身份验证系统。

我从教程中获得了使用 jsonwebtoken 的代码。

我的身份验证中间件 verifyToken 不工作。请帮忙

var express = require('express');
var router = express.Router();
var jwt = require('jsonwebtoken');
var models = require('../models');

function verifyToken(req, res, next) {
    var bearerHeader = req.headers['authorization'];
    if (typeof bearerHeader !== undefined) {

    } else {
        res.sendStatus(403)
    }
}

router.post('/tryjwt', verifyToken, (req, res, next) => {
    res.send('It worked');
});

router.get('/login', function (req, res, next) {
    const user = {
        id: 1,
        usename: 'ayoob',
        email: 'ayoob@gmail.com'
    }
    jwt.sign({ user: user }, 'secretkey', (err, token) => {
        res.json({ token: token })
    });
});

module.exports = router;

if (typeof bearerHeader !== undefined) 为真时,您没有执行任何操作。

确保调用 next 以便当前中间件可以将控制传递给下一个中间件

将此代码片段放入 if 语句中

try{
const decode = jwt.verify(bearerHeader, 'secretkey')
  //do something with the decode object 
   next()
}catch(err){
  res.sendStatus(403)
}

我认为问题在于 jwt.sign() 函数的异步性质 - 它在继续执行您的代码时继续对令牌进行签名 - 返回一个空的 json。您需要等待 jwt.sign() 在 res.json({token}) 之前完成,或者在 jwt 的魔法发生时做一些事情。

希望我有所帮助:)

p.s。使用 promises 是更好的做法,这样你的代码会更清晰,你不会陷入回调地狱,并且可以更好地处理错误。