【问题标题】:passport.js deserialization ok, but authentication not workingpassport.js 反序列化正常,但身份验证不起作用
【发布时间】:2014-11-18 23:09:44
【问题描述】:

我有一个工作的开发版本,甚至我的测试版本直到最近才工作。身份验证有时会起作用,但大多数情况下,身份验证会因 req.isAuthenticated() 而失败。

server.js:

var express  = require('express');
var app      = express();
var port     = PORTS[ENVIRONMENT];

var passport = require('passport');

var morgan       = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser   = require('body-parser');
var session      = require('express-session');

var passportConfigs = require('./config/passport');
var routes = require('./routes.js');

// App setup
app.use("/", express.static(__dirname + '/public/'));

// configuration ===============================================================
/* open mongo connection */
require('./database/' + ENVIRONMENT + '.js');

/* === passport configs === */
passportConfigs(passport, ENVIRONMENT);

// set up our express application
app.use(morgan(morganEnv)); // log every request to the console
app.use(cookieParser()); // read cookies (needed for auth)
//app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
})); // get information from html forms

app.set('view engine', 'ejs'); // set up ejs for templating

// required for passport
app.use(session({
   secret: '********' ,
   resave: false,
   saveUninitialized: false
}));
app.use(passport.initialize());   
app.use(passport.session()); // persistent login sessions

护照序列化:

passport.deserializeUser(function(id, done) {
  userQueries.findID(id)
     .then(function(user) {

        var firebaseRef = firebaseRefMod(user, environment).ref;
        if(!firebaseRef) {
           throw new Error('problem with generating firebase reference, dunno why!');
        }
        console.log("UserFirst:", { userData: filterUserData( user ), FBRef: firebaseRef })
        done(null, { userData: filterUserData( user ), FBRef: firebaseRef } );
     }).then(null, function(err) {
        console.log(err);
        done(err, null);
     });
});

路线:

app.post('/auth', isLoggedIn, function(req, res) {
  console.log("req", req.user)
  res.status(200).send({ "authKey": authGenerator.createToken(authGenerator.types.NORMAL, req.user.userData) , "user": req.user.userData } );
});
function isLoggedIn(req, res, next) {
  console.log("userIn", req.isAuthenticated())
  // if user is authenticated in the session, carry on
  if (req.isAuthenticated())
    return next();

  // if they aren't redirect them to the home page
  errorInRestRequest(res, errorCodes.userNotAuthenticated, req.user);
  return false;
}

所以基本上如果身份验证成功,isLoggedIn 函数就可以从 req.user 访问用户数据。即使认证不成功,每次通过"console.log("UserFirst:"...entry)验证用户反序列化都没有问题,但是req.user在到达isLoggedIn-时并没有持有数据功能。

不幸的是,我对护照和快递中间件的了解有限,所以我对数据在两者之间消失的位置感到困惑。

【问题讨论】:

    标签: express passport.js


    【解决方案1】:

    似乎问题是由错误的节点模块版本引起的。目前还没有具体细节,但将几个模块恢复为旧版本解决了这个问题。

    【讨论】:

    • 一个不幸的答案
    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 2018-02-17
    • 2019-01-20
    • 2015-11-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多