【问题标题】:Cannot return JWT token [duplicate]无法返回 JWT 令牌 [重复]
【发布时间】:2019-09-12 01:35:17
【问题描述】:

我已经构建了这个创建 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 语句时,它显示令牌未定义,而不是返回令牌。

【问题讨论】:

    标签: node.js jwt passport.js mern


    【解决方案1】:

    您可能在创建令牌时遇到问题。代码未检查令牌是否已成功创建。

    (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
                        })
                     }
    

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

    【讨论】:

    • 我试了一下,但是token创建成功
    【解决方案2】:

    问题似乎出在这里:

    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

    【讨论】:

    猜你喜欢
    • 2021-01-22
    • 2018-08-08
    • 2018-03-16
    • 2019-10-10
    • 2021-06-30
    • 2019-07-29
    • 1970-01-01
    • 2020-02-22
    • 2019-05-19
    相关资源
    最近更新 更多