2014-02-17 55 views
1

奇怪的行为,在这里。当我用正确的用户名/密码组合打/login时,它确实将我发送到/秘密路线。当我使用错误的组合时,它会将我的右侧正确地重定向到我开始的位置。passport.authenticate不按预期工作

但是,如果我试图“锁定”的路线,说:

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

然后我得到一个401: Unauthorized,如果我尝试登录后打它看来,一个cookie确实设置。但可能不是正确的。我已经验证用户是在本地策略中返回的,并且该序列化确实抓住了正确的用户。 如何正确配置护照以使用本地策略并锁定路线?我已经看过整个文档,看来我按照说明操作。

// 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')); 
}); 

回答

1

对于大多数情况下,我最初发布的所有东西都正常工作。

尽管护照上的网站缺乏良好的文档,我能够创建一个简单的中间件来检查,如果用户登录:

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

我不知道这是否是最好的方法这样做,但req.isAuthenticated由Passport本身提供,因此它必须有点标准。

+1

有趣的是,缺乏isAuthenticated的文档。除非我错过了某些东西,但只有在启用会话后才能正常工作。所以我可以确定它对你有用,但是它总是会返回false,因为我在护照初始化过程中完成了{sessions:false}。 – Rob