无法返回JWT令牌

时间:2019-09-12 01:35:17

标签: node.js jwt passport.js mern

我已经建立了用于创建JWT令牌的登录路由,但是在创建该令牌的函数之外,该令牌未定义,因此我无法在该函数之外使用它。

router.post('/login', (req, res) => {
    const { errors, isValid } = validateLoginInput(req.body);
    if (!isValid) {
        return res.status(400).json(errors);
    }
    const email = req.body.email;
    const password = req.body.password;
    User.findOne({ email }).then(user => {
        if (!user) {
            return res.status(404).json({ emailnotfound: "Email not found"});
        }
    bcrypt.compare(password, user.password).then(isMatch => {
        if (isMatch) {
            const payload = {
                id: user.id,
                name: user.name
            };
            var token =jwt.sign(
                payload, 
                keys.secretOrKey, 
                { expiresIn: 31556926 },
                (err, token) => {
                    res.json({
                        success: true,
                        token: "Bearer " + token
                    });
                });
            console.log(token)
            } else {
                return res.status(400).json({ passwordincorrect: 
"Password incorrect"});
            }
        });
    });
});

当代码点击该console.log语句时,它表明该令牌是未定义的,而不是返回该令牌。

2 个答案:

答案 0 :(得分:0)

似乎您创建的令牌可能有问题。代码不检查令牌是否创建成功。

(err, token) => {
                  res.json({
                  success: true,
                  token: "Bearer " + token
                  })
                }

将其更改为:

(err, token) => {
                 if (err){
                   console.log("Error while creating token:"+err.message);
                   console.error(err);
                   //send an error response as well if needed.
                 } else {
                    res.json({
                    success: true,
                    token: "Bearer " + token
                    })
                 }

这将帮助您找出问题所在。

答案 1 :(得分:0)

问题似乎在这里:

var token =jwt.sign(
                payload, 
                keys.secretOrKey, 
                { expiresIn: 31556926 },
                (err, token) => {
                    res.json({
                        success: true,
                        token: "Bearer " + token
                    });
                });

您可以检查正在使用的JWT库以查看它是否实际上接受回调吗?大多数JWT库上用于sign函数的正确语法是:

var token = jwt.sign(payload, secretKey, options);
console.log("Token :" + token);

选项通常包含以秒为单位定义的 expiresIn