2016-11-24 37 views
0

我已将nodejs护照登录添加到我的应用程序,并且一切正常,直到我承诺更改生产为止。这个问题非常有用:当我重新加载页面时,用户有时会随机更改。NodeJS和Passport:用户随机更改

这里是我的app.js代码:

var mysql = require('promise-mysql'); 
var passport = require('passport'); 
var app = express(); 

app.use(cookieParser()) 
app.use(session({ 
    secret: 'keyboard cat', 
    maxAge: 60 * 5, 
    resave: false, 
    saveUninitialized: false 
})) 
app.use(passport.initialize()); 
app.use(passport.session()); 


mysql.createConnection(dbConfig.connection).then(
    function (connection) { 
     require('./config/passport')(passport, connection); // pass passport for configuration 
    } 
); 

这是我在CONFIGS/passport.js

var LocalStrategy = require('passport-local').Strategy; 
var bcrypt = require('bcrypt-nodejs'); 
module.exports = function (passport, connection) { 
    passport.serializeUser(function (user, done) { 
     done(null, user.name); 
    }); 

    // used to deserialize the user 
    passport.deserializeUser(function (name, done) { 
     connection.query("SELECT * FROM users WHERE name = ? ", [name]) 
      .then(function (rows) { 
       done(null, rows[0]); 
      }) 
      .catch(function (err) { 
       console.log("Error getting user form DB: ", err); 
       done(err); 
      }); 
    }); 

passport.use(
     'local-login', 
     new LocalStrategy({ 
       usernameField: 'username', 
       passwordField: 'password', 
       passReqToCallback: true // allows us to pass back the entire request to the callback 
      }, 
      function (req, username, password, done) { // callback with email and password from our form 
       connection.query("SELECT * FROM users WHERE username = ?", [username]) 
        .then(function (rows) { 
         if (!rows.length) { 
          done(null, false); // req.flash is the way to set flashdata using connect-flash 
         } 

         // if the user is found but the password is wrong 
         else if (!bcrypt.compareSync(password, rows[0].password)) { 
          done(null, false); // create the loginMessage and save it to session as flashdata 
          // all is well, return successful user 
         } 
         else { 
          done(null, rows[0]); 
         } 

        }) 
        .catch(function (err) { 
         console.log("Login Failed: ", err.body); 
         done(err); 
        }); 
      }) 
    ); 
}; 

这是我在每一个路由文件:

router.all('*', function (req, res, next) { 
    if (req.isAuthenticated()) { 
     user.init(req.user); 
     next(); // pass control to the next handler 
    } 
    else { 
     res.redirect('/'); 
    } 
}); 

有没有人有类似的问题?似乎我做了一些简单而愚蠢的错误,因为谷歌无法找到类似的问题。

谢谢!

回答

0

结果是内存中由节点js存储的对象的问题。我不完全理解这是怎么发生的,但这是我发现的。

我将req.user存储在userModel对象中,并且如果服务器上有很多请求,则此userModel对象有时会与来自不同用户的数据混淆。

解决的办法是直接用户req.user无处不在。

1

你执行两个不同的查询:

// passport.deserializeUser() 
connection.query("SELECT * FROM users WHERE name = ? ", [name]) 

// In the Passport verification handler 
connection.query("SELECT * FROM users WHERE username = ?", [username]) 

我的猜测是,name不是唯一的,而且要使用username无处不在。

另外:您正在设置maxAge为300 毫秒