节点PassportJS身份验证:req.isAuthenticated()不会保持设置状态

时间:2014-12-07 21:11:09

标签: node.js authentication express oauth-2.0 passport.js

问题的简短摘要:我在Node.js网站上使用了新版本的快递(4.9.0),该网站有一些公共页面和一些私人页面,我将它放在Google OAuth2后面使用PassportJS登录。当我在登录后请求页面时,会不断要求用户登录; req.isAuthenticated()不是“粘性的”。我在网上看到一些评论可能存在cookie解析器版本不兼容的问题,所以这可能就是问题所在。

这是我的(相当长的)app.js:

var express = require('express');
var http = require('http');
var path = require('path');
var passport = require('passport');
var googleStrategy = require('passport-google-oauth').OAuth2Strategy;
var cookieParser = require('cookie-parser');
var bodyParser   = require('body-parser');
var session      = require('express-session');
var app = express();
app.use(cookieParser());  
app.use(bodyParser());  
app.use(session({ secret: 'mysecret' }));
app.set('view engine', 'html');
app.set('views', path.join(__dirname, 'views'));
app.engine('html', require('ejs').renderFile);
app.set('port', process.env.PORT || 3000);

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function(user, done) {
    done(null, user);
});

passport.deserializeUser(function(obj, done) {  
  done(null, obj);
});


passport.use(new googleStrategy({
    clientID: clientId,
    clientSecret: secret,
    callbackURL: "http://127.0.0.1:3000/auth/google/callback"
},
function (accessToken, refreshToken, profile, done) {

    process.nextTick(function () {
      return done(null, profile);
    });
    }
));   

app.get('/auth/google',
  passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/userinfo.profile',
                                            'https://www.googleapis.com/auth/userinfo.email'] }),
  function(req, res){   

  });

app.get('/auth/google/callback', 
  passport.authenticate('google', { failureRedirect: '/login' }),
  function(req, res) {
    console.log("successfully authenticated with google");
    res.redirect('/');
  });


app.get('/login', function(req, res){
  res.redirect('/auth/google');
});

app.get('/privatepage', ensureAuthenticated, function(req, res) {

    var dostuff = module.listThings(function(rows) {
        res.render('somepage.html', {
            title : "some page",
            data : rows
        });
    });
});

function ensureAuthenticated(req, res, next) {
    console.log("in ensureAuth", req.isAuthenticated());
    console.log("session data", req.session);
    console.log("user data", req.user);
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/login');
}


var server = app.listen(3000, function() {
    var host = server.address().address
    var port = server.address().port
    console.log('App listening at http://%s:%s', host, port)
})

首次登录后,如果我访问/ privatepage网址,我会通过Google重新定向并再次登陆主页。这是来自那些console.log行的日志:

in ensureAuth false
session data { cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: {} }
user data undefined

我认为这是一个会话问题,它没有存储用户的登录状态,但我是一个节点新手&我有点坚持如何解决这个问题。我在一台计算机上运行,​​所以这不是多机问题。有关冲突的任何调试建议或想法导致登录状态不被存储?

0 个答案:

没有答案