0

我试图/enquete/login. 我正在使用passport-local来实现它。我已经检查了登录函数返回一个用户(req.isAuthorized()是真的),它实际上是试图去/enquete但是当试图以/enquete某种方式访问​​时req.isAuthorized()是假的。所以我无法访问它:(。

我想知道我在这里错过了什么?这是正确的方法吗?

这些是我的代码的一部分:

passport.use(new LocalStrategy(function (username, password, done) {
    process.nextTick(function() {
        model.findByUsername(username, function(err, user) {
            if (err) { return done(err); }
            if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
            if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
            return done(null, user); // <<-- I pass this so login was OK
        });
    });
}));

...

var app = express();

app.set('view engine', 'ejs');
app.use(less(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

app.use(cookieParser());
app.use(session({ secret: '123', resave: true, saveUninitialized: true }));

app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(flash({ locals: 'flash' }));


...

app.post(
    '/login',
    passport.authenticate(
        'local',
        { successRedirect: '/enquete', // <--- Please read below note on this
          failureRedirect: '/login' }));

function ensureLocalAuthenticated(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/login');
}

app.get(
    '/enquete',
    ensureLocalAuthenticated,
    function(req, res) {
        res.render('pages/enquete');
    });

注意:
我已经调试passport.authenticate以确保登录确实成功。由于我提供successRedirect选项然后return res.redirect(options.successRedirect);发生在附近node_modules/passport/lib/middleware/authenticate.js:245。我已经检查req.isAuthorized()过在重定向之前确实是真的。

然而 inensureLocalAuthenticated req.isAuthorized是假的。为什么?!

我搞不清楚了。任何帮助表示赞赏

4

1 回答 1

0

愚蠢,但它是有道理的。我发现原因是中间件的顺序不对!(捂脸)。将代码更改为此使我的服务器按预期工作。

var app = express();

app.set('view engine', 'ejs');
app.use(less(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

app.use(cookieParser());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ secret: '123', resave: true, saveUninitialized: true }));
app.use(flash({ locals: 'flash' }));

app.use(passport.initialize());
app.use(passport.session());
于 2015-05-02T05:16:59.503 回答