为什么jwt.sign函数不能将我的用户识别为对象?

时间:2017-09-21 12:04:46

标签: node.js jwt passport.js

我正在研究项目并且我发现了奇怪的问题,jwt.sign函数不能识别传递的用户作为对象,但是当我在jwt.sign中创建新对象时,它工作正常。

如果从文本中难以理解的是代码:

var username = req.body.username;
var password = req.body.password;

User.getUserByUsername(username,(err, user)=>{
    if(err) 
        throw err;
    if(!user) 
        return res.json({success: false, msg: "User with username "+ username+" doesn't exist"});

    User.comparePassword(password, user.password, (err, passwordsMatched) =>{
        // Prints that user is type of object
        console.log("Type of user: "+typeof(user));
        if(err) throw err;

        if(passwordsMatched){
            // line bellow throws error that it expects object when I pass user
            var token = jwt.sign(user, Config.secret, {expiresIn: 604800});
            res.json({
                success: true, 
                token: 'JWT '+token, 
                user: {
                    name : user.name, 
                    username: user.username 
                }
            });
        }else{
            return res.json({success: false, msg: "Password doesn't match"});
        }
    });
});

var token = jwt.sign(user, Config.secret, {expiresIn: 604800});会抛出以下错误:

错误:预期的对象     at validate ...(jsonwebtoken和bcrypt模块的路径+我称之为jwt.sign的行)

所以我试图修复,我发现如果我在函数调用中创建用户数据的新对象然后它可以工作,它看起来像这样:

var token = jwt.sign({_id : user._id, 
                      username: user.username, 
                      password: user.password
                     }, 
                     Config.secret, 
                     {expiresIn: 604800}); 

所以我的问题是为什么函数不接受我的用户对象以及是否有解决方案让它接受?

1 个答案:

答案 0 :(得分:7)

查看jsonwebtoken的{​​{3}},可以调用lodash的code函数:

  

检查value是否是普通对象,即Object构造函数创建的对象或[[Prototype]]为null的对象。

您的user对象必须通过此验证检查,这会导致您的错误。您尝试的修复似乎是合理的,但如果您使用的是Mongoose,则可以使用isPlainObject。 e.g:

var token = jwt.sign(user.toObject(), Config.secret, {expiresIn: 604800});