socket.io und express-4 Sitzungen

Ich würde gerne das express-4-Sitzung in meiner Steckdose.io-app.
Ich bin Art von neuen mit Knoten und ich habe einige Probleme die Implementierung dieser Funktionalität.

Fand ich eine npm-Modul, ermöglicht Zugriff auf die express-4-Sitzung : https://www.npmjs.org/package/session.socket.io-express4 oder https://github.com/eiriklv/session.socket.io

Wenn Sie Blick auf meine app.js -code unten, ich mache etwas falsch in der session, sessionStore oder cookieParser setup, weil ich einfach nicht mit diesem Modul arbeiten.

//init modules
var express = require('express');
var helmet = require('helmet');
var fs = require('fs');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var memoryStore = session.MemoryStore;
var app = express();

//set variables
var options = {
  key: fs.readFileSync('./openssl_keys/server_key.pem'),
  cert: fs.readFileSync('./openssl_keys/server_cert.pem')
};
var cookieSecret = "secret phrase";
var sessionStore = new memoryStore();

app.set('env', process.env.NODE_ENV || 'development');

//view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser(cookieSecret));
app.use(session({
    secret: cookieSecret,
    cookie: {httpOnly: true, secure: true},
    store: sessionStore
}));
app.use(function(req, res, next){
    res.locals.session = req.session;
    next();

});
app.use(express.static(path.join(__dirname, 'public')));

//routes
require('./routes/index')(app);
require('./routes/test')(app);


//starting http and https servers
var http = require('http').createServer(app).listen(8000, function(){
    console.log("http server listening on port 8000");
});
var https = require('https').createServer(options, app).listen(8080, function(){
    console.log("https server listening on port 8080"); 
});

//starting socket.io & session handler
var serverIO = require('socket.io').listen(https);
var SessionSockets  = require('session.socket.io-express4');
var io = new SessionSockets(serverIO, sessionStore, cookieParser);

io.on('connection', function(err, socket, session){
    if(err) throw err;
    console.log("connected");
    //console.log(session);
    socket.on('clientMessage', function(content) {
        console.log("received client message")
        console.log(content);
    });

});

module.exports = app;

Ich habe versucht, die vielfachen Möglichkeiten wie :

  • Deaktivieren https server.
  • Einrichtung eines cookieParser Objekt mit geheimen Satz (so es "eigentlich" exportiert den geheimen Satz zu io = new SessionSockets(serverIO, sessionStore, cookieParser);)
  • Mit minimalen cookie Optionen.

Trotzdem bin ich ein bisschen verloren mit dieser, irgendwelche Vorschläge/Kritik sind willkommen.


UPDATE

Ok so, nach zahlreichen versuchen habe ich denke ich könnte es funktionieren!

Ist das problem mit der cookieParser die Initialisierung der richtige Weg zu sein scheint :

var cookieParser = require('cookie-parser');
app.use(cookieParser());
app.use(session({
    secret: "secret phrase",
    cookie: {httpOnly: true, secure: true},
    store: sessionStore
}));
var io = new SessionSockets(serverIO, sessionStore, cookieParser());

Beachten Sie, dass, wenn ich var io = new SessionSockets(serverIO, sessionStore, cookieParser); (statt cookieParser()), dann dann funktioniert es nicht. , Dass scheint das problem zu sein.

Wenn ich :

app.use(cookieParser("secret phrase"));
app.use(session({
    secret: "secret phrase",
    cookie: {httpOnly: true, secure: true},
    store: sessionStore
}));
var io = new SessionSockets(serverIO, sessionStore, cookieParser("secret phrase"));

dann das Modul stürzt mit folgender Fehlermeldung :

session.socket.io-express4/session.socket.io.js:41
ake.signedCookies[key] = handshake.signedCookies[key].match(/\:(.*)\./).pop();
                                                                        ^
TypeError: Cannot call method 'pop' of null

Aber wenn ich :

app.use(cookieParser("secret phrase"));
app.use(session({
    secret: "secret phrase",
    cookie: {httpOnly: true, secure: true},
    store: sessionStore
}));
var io = new SessionSockets(serverIO, sessionStore, cookieParser());

Dann sieht alles gut aus.

Nun in der cookie-parser-doc (https://github.com/expressjs/cookie-parser) Sie sagen, Sie können gehen einen geheimen Schlüssel, um die cookies unterzeichnet. Das ist etwas, was ich möchte.

Könnte mir jemand erklären mir den Zusammenhang mit den cookie-parser geheimen phrase und dem session-secret-phrase ? Haben Sie die gleiche/unterschiedliche ?

Siehe auch in diesem Zusammenhang zu beantworten: stackoverflow.com/a/24859515/1407170

InformationsquelleAutor Bobby Shark | 2014-05-06

Schreibe einen Kommentar