NodeJS和Passport:用户随机更改

时间:2016-11-24 17:16:13

标签: node.js express authentication passport.js

我已将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('/');
    }
});

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

谢谢!

2 个答案:

答案 0 :(得分: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 毫秒

答案 1 :(得分:0)

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

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

解决方案是直接在任何地方用户req.user。