2016-11-24 9 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 
    } 
); 

は私がのcon​​figs/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('/'); 
    } 
}); 

誰も同じような問題を抱えていますか? Googleは類似の問題を見つけることができないので、私はいくつかの単純で愚かなエラーを作ったようだ。

ありがとうございます!

答えて

0

ノードjsに格納されているオブジェクトのメモリに問題があることが分かります。私はこれがどう起こったのか完全に理解していませんが、これは私が見つけたものです。

私はreq.userをuserModelオブジェクトに格納していました。サーバ上で多くのリクエストがあった場合、このuserModelオブジェクトは異なるユーザからのデータで混乱することがあります。

解決方法はどこでもreq.userに直接アクセスすることでした。

1

次の2つの異なるクエリを実行している:

// 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 ミリ秒に設定しています。

関連する問題