在Passport.js中配置本地策略

时间:2014-01-04 18:19:33

标签: node.js passport.js

我对Node.js有点新意,下面是我的问题。

我有这样的代码,

passport.authenticate('local', function (error, user, info) {
    console.log("authentication happening");
    console.log(info);
    if (error) {
        return res.send(error);
    }
    else if (!user) {
        return res.send("User not found");
    }
    else {
        req.logIn(user, function (error) {
            if (error) {
                return res.send(error);
            }
            else {
                return res.json(
                    {
                        id: user
                    });
            }
        });
    }
    return false;
})(req, res, next); 

//如果我删除最后一组参数,它不会给出错误它会做什么?即使我删除了它,它仍然不会发送响应。

我的策略设置代码如下,

passport.use(new LocalStrategy(function (username, password, done) {
    userManager.findOne(username, function (err, user) {
        if (err) {
            return done(err);
        }
        if (!user) {
            return done(null, false, {
                message: 'Incorrect username.'
            });
        }
        userManager.isValidPassword(username, password, function (error, result){
            if (result === true) {
                return done(null, user, {
                    message: 'success'
                });
            }
            else {
                return done(null, false, {
                    message: 'Incorrect password.'
                });
            }
        });
        return done("error", false, {
            message: 'Error'
        });
    });
}));

但是当我运行它时会出现如下错误,

D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\base.js:242
         throw message;
               ^
TypeError: object is not a function
     at D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\collection\query.js:147:5
     at Cursor.nextObject (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\cursor.js:733:5)
     at commandHandler (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\cursor.js:713:14)
     at D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\db.js:1806:9
     at Server.Base._callHandler (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\base.js:442:41)
     at D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\server.js:485:18
     at MongoReply.parseBody (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\responses\mongo_reply.js:68:5)
     at null.<anonymous> (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\server.js:443:20)
     at EventEmitter.emit (events.js:95:17)
     at null.<anonymous> (D:\Education\Projects\Social\social\Dev\server\NodeProject\node_modules\mongodb\lib\mongodb\connection\connection_pool.js:191:13)

1 个答案:

答案 0 :(得分:4)

你的passport.authenticate看起来很奇怪。

以下是我们工作副本中的代码:

app.post('/login', 
    passport.authenticate('local', { failureRedirect: failRedirect, failureFlash: false }),
            function(req, res) {
                log.info(req.user.username+' is successfully logged in.');
                log.info(JSON.stringify(req.user));
                res.redirect(successRedirect);
            });

passport.authenticate没有第二个参数作为回调。 相反,它返回true或false以允许重定向发生。 因此,如果登录成功,则authenticate调用将返回true,将调用下一个函数并发生res.redirect(successRedirect)。 否则,failRedirect将被发送给用户并将用户重定向到登录页面失败。

以下是我们的策略代码:

passport.use(new LocalStrategy(function(username,password,done){
        log.info(username+"//"+password+" is trying to login as local.");
        var userModel = mongoose.model('users',userSchema);
        userModel.findOne({'username':username})
            .exec(function(err,puser){
                if(err){log.info(err.stack);}
                if(!puser){
                    log.info("user not found.");
                    return done(null, false, { message: 'Unknown user ' + username });
                }
                if (password!==puser.password) {
                    log.info("password invalid.");
                    return done(null, false, { message: 'Invalid password' });
                }
                return done(null, puser);
        });
    }));

您对此部分的策略看起来不错。


编辑:

您的回复现在向我解释为什么您会看到错误。

app.get('/login', function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (err) { return next(err); }
        if (!user) { return res.redirect('/login'); }
            req.logIn(user, function(err) {
        if (err) { return next(err); }
            return res.redirect('/users/' + user.username);
        });
    })(req, res, next);
});

与您的代码进行比较:

passport.authenticate('local', function (error, user, info)
{
    ...implementation
})(req, res, next);

非常不同。

必须在function(req,res,next){(passport.authentication)(req,res,next)}内调用

app.get('path',method)。在这种情况下,express.get调用提供了3个参数。因此,req,res,next实际上可以执行示例中显示的方式。如果您从外面(passport.authentication)(req,res,next),则不会填充req,res,next。你的代码会失败。