passport.authenticate没有按预期工作

时间:2014-02-17 05:45:54

标签: node.js passport.js

奇怪的行为,在这里。当我用正确的用户名/密码组合命中/login时,它确实将我发送到/ secret路径。当我使用错误的组合时,它正确地将我的权利重定向回我开始的地方。

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

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 个答案:

答案 0 :(得分:1)

在大多数情况下,我最初发布的所有内容都可以正常使用。

尽管Passport网站缺乏良好的文档,但我能够创建一个简单的中间件来检查用户是否已登录:

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

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