Ich habe eine App, die Passport.js verwendet, um Benutzer über Facebook anzumelden, und versuche, Express-Mysql-Session zu verwenden, um ihre Anmeldezustände beizubehalten. Wenn ich den Express-Mysql-Session-Code nicht einfüge, funktionieren die Passport-Funktionen serializeUser und deserializeUser einwandfrei nicht getroffen, und der Benutzer wird nie richtig angemeldet.
server.js-Datei
var express = require('express');
var mysql = require('mysql');
var passport = require('passport');
var session = require('express-session');
var MySQLStore = require('express-mysql-session')(session);
if (typeof process.env.OPENSHIFT_MYSQL_DB_HOST === "undefined"){
var options = {
host : 'localhost',
port : '3307',
user : 'user',
password : 'password',
database : 'database',
socketpath: '/var/run/mysqld/mysqld.sock'
}
} else {
var options = {
host : process.env.OPENSHIFT_MYSQL_DB_HOST,
port : process.env.OPENSHIFT_MYSQL_DB_PORT,
user : process.env.OPENSHIFT_MYSQL_DB_USERNAME,
password : process.env.OPENSHIFT_MYSQL_DB_PASSWORD,
database : process.env.OPENSHIFT_APP_NAME,
socket : process.env.OPENSHIFT_MYSQL_DB_SOCKET
}
};
var connection = mysql.createConnection(options);
var sessionStore = new MySQLStore({
checkExpirationInterval: 900000,// How frequently expired sessions will be cleared; milliseconds.
expiration: 86400000,// The maximum age of a valid session; milliseconds.
createDatabaseTable: false,// Whether or not to create the sessions database table, if one does not already exist.
connectionLimit: 1,
schema: {
tableName: 'LoginRequests',
columnNames: {
session_id: 'loginID',
expires: 'expires',
data:'data'
}
}
}, connection);
self.initializeServer = function() {
self.app = module.exports = express();
self.app.configure(function() {
self.app.set('views', __dirname + '/public');
self.app.set('view engine', 'html');
self.app.engine('html', require('hogan-express'));
self.app.enable('view cache');
self.app.use(express.favicon());
self.app.use(express.logger('dev'));
self.app.use(express.bodyParser());
self.app.use(express.methodOverride());
self.app.use(express.cookieParser('secret'));
self.app.use(session({
key: 'session_cookie_name',
secret: 'secret',
cookie: {maxAge: 3600000, secure:false},
store: sessionStore,
resave: false,
saveUninitialized: false
}));
// required for passport
self.app.use(passport.initialize());
self.app.use(passport.session()); // persistent login sessions
self.app.use(express.static(path.join(__dirname, 'public')));
self.app.use('/public',express.static(__dirname, '/public'));
self.app.use(self.app.router);
//self.app.use(require('stylus').middleware(__dirname + '/public'));
});
require('./routes/site.js');
require('./config/passport.js')(passport); // pass passport for configuration
}
Wenn ich also die Option “Speichern” im obigen Sitzungsobjekt auskommentiere, werden die Passport-Funktionen getroffen. Wenn ich diese Zeile unkommentiert lasse, wird die Funktion deserializeUser nicht getroffen.
Passfunktionen
passport.serializeUser(function(user, done) {
console.log('you have been serialized!');
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
console.log('you have been deserialized!');
connection.query("SELECT * FROM Users WHERE id = "+id,function(err,rows){
done(err, rows[0]);
});
});
BEARBEITEN
Mor Paz schlug vor, dass ich einige der Protokolle einfüge, wenn ich meinen Server mit dem Debug-Modul betreibe. Nachfolgend sind die Protokolle direkt vor und unmittelbar nach der Serialisierung des Benutzers aufgeführt. Der Benutzer sollte irgendwann in der Nähe deserialisiert werden, ist es aber nie.
GET /auth/facebook 302 81ms - 412b
express-mysql-session:log Getting session: oNcJ4UapxCY_zKOyfSBTUWaVhaNZuFRq +356ms
you are a user!
you have been serialized!
express-mysql-session:log Setting session: tgRPY-Mb1VDP2zaSMOFhlf_IWFhVpTia +798ms
express-mysql-session:log Getting session: tgRPY-Mb1VDP2zaSMOFhlf_IWFhVpTia +6ms
GET /auth/facebook/callback? code=AQCWPvA5ZRMYoTueW6_wWU49Up5ggjW68ufOtiYkU5IzhRjSNyyWnzlQVprgQo_uubQkEVvNI0yo53ET3cWBnDAHUGmAXPBy_ITEmC-biE2KEGEr0iCm_cqjuG90nnePY-k9U2oFUbX2kvLgMeM0kZ-094EHiU_NJjmAJNj6mzTkSE47935RhJy0Tba_sYS88_C0N3kn5f5kcoTC4KsgW1gBHWWJAwZ68Lj94ffVe2hN97580CtzEpJa0wwQHwTBYfmjQ0NfUdx07m4rXW9R7PR06aHDcUDrYqR9Kb0LWq4sZLbQjV5rI7gzkWG-huhq7IY 302 825ms - 72b
express-mysql-session:log Setting session: Xo9OjfmJzTFp1CSF6srLi_UyxTCLg-EI +56ms
express-mysql-session:log Getting session: Xo9OjfmJzTFp1CSF6srLi_UyxTCLg-EI +23ms
express-mysql-session:log Getting session: Xo9OjfmJzTFp1CSF6srLi_UyxTCLg-EI +2ms
GET /profile 200 84ms - 4.22kb
Können Sie die Protokolle von Node hinzufügen? Das
express-mysql-session
-Modul sollte viele Protokollinformationen ausgeben, wenn es in DEBUG ausgeführt wird– Mor Paz
3. Oktober 2016 um 12:20 Uhr
Wie führe ich den Knoten im DEBUG-Modus aus?
– Benutzer2796352
4. Oktober 2016 um 23:09 Uhr
Sind Sie sicher, dass die Verbindung zu
mysql
erfolgreich etabliert? Verwendenconnection.connect()
und fügen Sie einen Rückruf mit einem err-Argument zum Aufruf von hinzuconnect
um sicherzustellen, dass die Verbindung problemlos hergestellt wird. *PS: Verwenden Sie tatsächlich Port3307
zu? weil mysql standardmäßig ist3306
– Omar A
5. Oktober 2016 um 15:55 Uhr
Ich habe diese Module, die mit diesen Versionen gut zusammenarbeiten: Express 3.0, Passport 0.3, Express-Session 1.11, Express-Mysql-Session 1.2. Ich kann Ihren Fehler nicht replizieren, aber mir fehlen die Versionsinformationen, wie sowie Ihre Passstrategien zum An- und Abmelden. Können Sie ein Gist- oder Github-Repo bereitstellen, in dem der Fehler repliziert werden kann?
– Larry Turtis
16. Oktober 2016 um 20:50 Uhr
@user2796352 Hast du eine Lösung für dieses Problem gefunden?
– Sagar V
7. Juli 2017 um 6:52 Uhr