我已将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 :(得分: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。