• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Gleich nach Login ausgeloggt, expressjs

xorg1990

New member
Ich habe ein echt nerviges Problem bei meinem Login System.
Ich werde nach einer Zufälligen zeit aus den System ausgeloggt, meist nach ein paar sec.
Mach mal klappt es aber auch.

login route:
Code:
app.post("/login", function(req, res) {
        var userName = req.body.email;
        var pass = req.body.password;
        var remember = req.body.remember;
        //cookie zrücksetzen
        if(req.session.cookie.maxAge !== null){
        	delete req.session.cookie.maxAge;
        	delete req.session.cookie.expires;
        	//req.session.cookie.maxAge = null;
        	//req.session.cookie.expires = false;// or null
        }
        athenticate(req.body.email, req.body.password, function(err, id, callsign) {
            if (err) {
                return modifyForms("login", err.message, function(err, result) {
                    if (err) {
                        res.send(err);
                    } else {
                        res.send(result);
                    }
                })
            } else {
                if (id) {
                    checkConfirmed(callsign, function(err) {
                        if (err) {
                            return modifyForms("login", err.message, function(result) {
                                res.send(result);
                            });
                        } else {
                            if (remember) {
                                var hour = 60 * 60 * 1000;
                                req.session.cookie.expires = new Date(Date.now() + hour);
                                req.session.cookie.maxAge = hour;
                            }
                            req.session.callsign = callsign;
                            req.session.uid = id;
                            res.redirect('profile?tab=dashboard');
                        }
                    });
                } else {
                    req.session.error = "Login failed, try again";
                    res.redirect('login');
                } //if id
            }
        });
    });
Interessant ist nur:
Code:
 if (remember) {
                                var hour = 60 * 60 * 1000;
                                req.session.cookie.expires = new Date(Date.now() + hour);
                                req.session.cookie.maxAge = hour;
                            }
                            req.session.callsign = callsign;
                            req.session.uid = id;
                            res.redirect('profile?tab=dashboard');
                        }

oben habe ich noch folgendes stehen:
Code:
       if(req.session.cookie.maxAge !== null){
        	delete req.session.cookie.maxAge;
        	delete req.session.cookie.expires;
        	//req.session.cookie.maxAge = null;
        	//req.session.cookie.expires = false;// or null
        }
Da wollte ich das cookie zurücksetzen wenn man von der Hauptseite kommt weil ich dort eine User counter mit ip sperre habe.
Aber wie setzt man das Cookie richtig zurück.
Delete oder req.session.cookie.maxAge = null; oder req.session.cookie.maxAge = false ??

Vollständigkeitshalber der Counter mit ip sperre
Code:
  app.get("/", tracker, function(req, res) {
        //counter stuff
        var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
        var hour = 60 * 60 * 1000 * 8; //8 Stunden
        //wenn user eingelogt gehe nicht in die couter 
        if (!req.session.uid) {  
            //wenn ip noch nicht vorhanden zähle user
            if (!req.session.ip || req.session.ip !== ip) {
                fs.readFile(__dirname+"/counts.txt", "utf8", function(err, data) {
                    var wstream = fs.createWriteStream(__dirname+"/counts.txt", "utf8");
                    if (err) {
                        throw err;
                    }
                    var counts = parseInt(data.split("\n")[0]); //nur erste zeile
                    counts += 1;
                    wstream.end(String(counts));
                });
                req.session.ip = ip;
                req.session.cookie.expires = new Date(Date.now() + hour);
                req.session.cookie.maxAge = hour;
                clicksToDay += 1;
            }
        }
....
......
es ist auch egal ob if (remember) true ist.

Ich nutze express4.x mit express-session-middleware

Ich nutze den standart memory Store, reicht für lokale Anwendung und 10 user.
Die Initialisierung:
Code:
var session = require("express-session");
var memoryStore = new session.MemoryStore();

   var sessionOptions = {
        store: memoryStore,
        secret: "*******",
        saveUninitialized: false,
        proxy: true,
        resave: true,
        cookie: {
            secure: false
        }
    };


  app.use("/piwik/plugins", express.static(__dirname + "/phpdocs/piwik/plugins"));
    app.use("/piwik/libs", express.static(__dirname + "/phpdocs/piwik/libs"));
    app.use("/adminer/images", express.static(__dirname + "/phpdocs/adminer/images"));
    app.use("/adminer/css", express.static(__dirname + "/phpdocs/adminer/css"));
    app.use("/adminer/fonts", express.static(__dirname + "/phpdocs/adminer/fonts"));
    app.all(/.+\.php$/, php.cgi("./phpdocs"))
    app.use(bodyParser.urlencoded({extended: true}));
    app.use(bodyParser.json());
    app.use(session(sessionOptions));
    app.use("/grabber/css", express.static(__dirname + "/css"));
    app.use("/css", express.static(__dirname + "/css"));
    app.use("/img", express.static(__dirname + "/img"));
    app.use("/grabber/lib", express.static(__dirname + "/scripts"));
An den user counter liegt es nicht, das habe ich schon Auskommentiert gehabt.
Mansch mal liegt es der reinfolge der Initialisierung.

Das Problem macht mich echt wild:mad:
Für konstruktive Vorschläge wäre ich sehr, sehr, dankbar.
 
Wird ev. die session nicht innerhalb des clusters geteilt? (Bzw. wie werden die Sessiondaten gespeichert? Wenn die nur im RAM sitzen, musst du die Sessionverwaltung eigentlich im Master machen...)

Dann könntest du manchmal auf einen anderen Worker kommen, der dich dann natürlich nicht kennt.
 
kkapsner schrieb:
Wird ev. die session nicht innerhalb des clusters geteilt?
Jo, so ist es:
node.js - Nodejs Clustering and expressjs sessions - Stack Overflow


kkapsner schrieb:
wie werden die Sessiondaten gespeichert?
keine Ahnung, das macht der sesssion-memory-store.

kkapsner schrieb:
musst du die Sessionverwaltung eigentlich im Master machen...
Wie?

Aktuell ist der Aufbau so:
Code:
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    // Fork workers.
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    cluster.on('exit', function(worker, code, signal) {
        console.log("worker " + worker.process.pid + " died");
    });
} else {
 var bodyParser = require('body-parser');
    var session = require("express-session");
    var express = require("express");
    var mysql = require("mysql")
//....
//... usw...


var memoryStore = new session.MemoryStore();

var sessionOptions = {
        store: memoryStore,
        secret: "******",
        saveUninitialized: false,
        proxy: true,
        resave: true,
        cookie: {
            secure: false
        }
    };

//...
//.....
 app.use(session(sessionOptions));


 W_Server.listen(2000, function() {
        console.log("Server listen at port 2000")
    });
} //cluster
 
die lösung steht doch in deinem link. wenn du als datenspeicher bei allen eine db nimst, haben alle zugriff auf die daten, wenn es ein stück speicher ist wie bei dir, hat jeder prozess eigene daten, was nicht gewünscht ist.
 
Zurück
Oben