passportauthentication不能按预期工作

奇怪的行为,在这里。 当我用正确的用户名/密码组合/login时,它确实将我发送到/秘密路线。 当我使用错误的组合时,它会正确地将我的右侧重新导向到我开始的位置。

但是,如果我试图“locking”一条路线,请说:

 app.get('/mySecretRoute', passport.authenticate('local'), function(req, res, next){ res.json({test:"secret"}); }); 

然后我得到一个401: Unauthorized如果我尝试login后打它。看来,一个cookie确实设置,但可能不是正确的。 我已经validation了用户是在本地策略中返回的,并且该序列化确实抓住了正确的用户。 我如何正确configuration护照使用本地策略并locking路由? 我已经看了整个文档,似乎我按照说明。

 // all environments app.set('port', process.env.PORT || 3000); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.json()); app.use(express.urlencoded()); app.use(express.methodOverride()); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); mongoose.connect(config.mongo.host + ':' + config.mongo.port + '/' + config.mongo.db_name); app.get('/', routes.index); app.get('/secret', function(req, res, next){ res.render("secret"); }); app.get('/login', function(req, res, next){ res.render("login"); }); app.post('/login', passport.authenticate('local', { successRedirect: '/secret', failureRedirect: '/' }) ); app.get('/register', function(req, res, next){ res.render('register'); }); app.post('/register', register); passport.use(new LocalStrategy( function(username, password, done) { User.findByUsername(username, function(err, user) { console.log(username); if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Incorrect username.' }); } if (!user.validPassword(password)) { return done(null, false, { message: 'Incorrect password.' }); } return done(null, user); }); } )); passport.serializeUser(function(user, done) { console.log(user._id); done(null, user._id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); function register(req, res, next) { console.log(req.body.username); console.log(req.body.password); User.addUser(req.body.username, req.body.password, function(err){ if(err) throw new err; }); } http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); 

在大多数情况下,我原来发布的一切工作正常。

尽pipePassport的网站上缺乏良好的文档,但我能够创build一个简单的中间件来检查用户是否login:

 exports.loggedIn = function(req, res, next) { console.log('Checking credentials...'); console.log(req.user); if(req.isAuthenticated()){ next(); } else { res.redirect("/"); } }; 

我不确定这是否是最好的方式,但是req.isAuthenticated是由Passport自己提供的,所以它必须是有标准的。