2017-10-13 3 views
3

Ich kann nicht verstehen, warum dies genau passiert, da es perfekt vor arbeitete.Socket.io nicht teilen Sitzungen mit Express

Ich verwende die folgenden Bibliotheken:

"express-socket.io-session": "^1.3.2" 
"socket.io": "^2.0.3" 
"express": "^4.15.4" 
"express-session": "^1.15.5" 

1 - ich anmelden, um den Benutzer über eine HTTP-Anfrage und das Cookie zurück an das Frontend senden. Alle Operationen auf http funktionieren perfekt mit dem Cookie im Frontend Backend tauscht.

2 - Nachdem der Benutzer angemeldet ist sagen, dass ich das Frontend "ok, Benutzer angemeldet ist, nun an die Buchsen anschließen":

io (this.url); 

Hier ist der relevante Code:

var io_session = require("express-socket.io-session"); 
var e_session = require("express-session"); 

var sessionFileStore = require('session-file-store')(e_session); 

var ee_session = e_session({ 
    store: new sessionFileStore({ path: './user_sessions' }), 
    secret: "something-random", 
    resave: true, 
    saveUninitialized: true 
}); 

var enableCORS = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', req.headers.origin); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'Origin, Accept, Content-Type, Authorization, Content-Length, X-Requested-With, *'); 
    res.header('Access-Control-Allow-Credentials',true); 

     // intercept OPTIONS method 
    if ('OPTIONS' == req.method) { 
     res.sendStatus(200); 
    } else { 
     next(); 
    }; 
}; 

app.use(function(req, res, next) {  
    /// 
    next(); 
}); 

//app.use(cookieParser()); 
app.use(enableCORS); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 
app.use(ee_session); 

preparedApp = require("http").Server(app); 

var io = require("socket.io")(preparedApp); 

io.use(io_session(e_session,{ 
    autoSave: true 
})); 

preparedApp.listen(8080, function(){}); 

io.on('connection', function(socket){ 

    var socket_session = socket.handshake.session, 
     socket_session_id = socket.handshake.sessionID; 

    console.log("SOCKET_SESSION:",socket_session); 
    console.log("SOCKET_SESSION_ID:",socket_session_id); 

    (...) 

3 - socket_session ist 'leer', aber alles in den regulären http Cookies funktioniert. Die Sitzung wird dort beibehalten.

Eine Sache, die ich bemerkte, ist, dass socket_session_id zeigt auf eine Sitzungsdatei , die nicht existiert in dem Ordner user_sessions. Die einzigen, die existieren, werden in der http-Anmeldung erstellt. Also, im Grunde:

=> Benutzeranmeldungen: efihaeif939311kf3f3 Sitzung ID-Datei erstellt.

=> Sockel verbindet: fiaejgieofaekofek ist die Session-ID in dem gleichen Login Fluss aber Datei nicht existiert in user_sessions (beachten Sie, dass die Session-ID ist nicht das Gleiche)

Jede Idee, warum diese es passiert? Ich habe absolut keine Ahnung.

Dank

+1

'var e_session = e_session ({...})' ist schlecht, ich würde die Variable in 'session' umbenennen, also ist es klar und du überschreibst nicht den Importref (es könnte tatsächlich die Quelle deines sein Problem). – James

+0

@James Schon, aber das Problem besteht weiter. – Fane

+0

@James keine andere Idee? Immer noch fest :( – Fane

Antwort

0

versuchen, die Sitzung zu teilen, indem die Sitzung json stringifying und Abrufen und zurück zum Session-Objekt in der Client-Seite Parsen.

Dies könnte funktionieren.

+0

Es wird höchstwahrscheinlich funktionieren ja, aber es wird auch die App anfällig für Identitätsattacken machen, wahrscheinlich ... – Fane

Verwandte Themen