【问题标题】:Why jwt.sign function doesn't recognize my user as object?为什么 jwt.sign 函数不能将我的用户识别为对象?
【发布时间】:2018-03-02 18:41:45
【问题描述】:

我正在做项目,发现奇怪的问题,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}); 行抛出以下错误:

错误:预期对象 在验证 ...(jsonwebtoken 和 bcrypt 模块的路径 + 我调用 jwt.sign 的行)

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

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

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

【问题讨论】:

  • 看来 user 是一个猫鼬对象。尝试做user.toObject();

标签: node.js jwt passport.js


【解决方案1】:

查看codejsonwebtoken,有调用lodash的isPlainObject函数:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-22
    • 2018-01-20
    • 1970-01-01
    • 2021-10-22
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多