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 zuio = 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 ?
InformationsquelleAutor Bobby Shark | 2014-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist meine Lösung für folgende Umgebung:
Code:
Dann können Sie den Zugriff auf die session aus der Steckdose ' s handshake:
Für Menschen, die sich Fragen, wie/warum das funktioniert:
handshake
Anfrage durch den cookie erzeugten parser so, dass cookies vorhanden sindhandshake
durch session-middleware als wenn Ihr eine normale Anfragesession
auf die Anfragehandshake
denn für alle Absichten und Zwecke, es ist eine normale Anfrage, und der parser-und session-middleware kann im Umgang mit ihm richtig. Dies ist der Grund, warum müssen Sie Zugriff auf diesession
durch diehandshake
Adkinson ich habe keine Ahnung, wie schreiben auf den Keks, können Sie bitte helfen? Wenn ich Daten speichern, um die Buchse.handshake.Sitzung wird es nicht bleiben.
Ich bin mir nicht 100% sicher, weil ich habe es nicht ausprobiert, aber über die websocket-Verbindung, werden Sie wahrscheinlich nicht gehen, um in der Lage sein, ein update der session-cookie, weil der browser nicht, Lesen Sie die Set-Cookie-header für eine websocket-Nachricht, die er erhält. Wahrscheinlich nur auf der handshake geht es durch den normalen Prozess. Wenn Sie server-cookies, Sie können mehr Glück haben, da der session-Informationen werden auf dem server gespeichert, und Sie konnte es zu aktualisieren gibt. Sinn?
OK, vielen Dank für dein replay, ich bin noch auf der Suche nach einer richtigen Lösung.
InformationsquelleAutor Sean Adkinson
Mit der neuen express-session-middleware-alles, was Sie tun müssen, ist fügen Sie die IO-middleware:
Ein vollständiges Beispiel sieht so aus:
Erstellte ich ein super-mini-npm-Paket socket.io-express-Sitzung das funktioniert wie ich oben erklärt.
InformationsquelleAutor xpepermint
Dieser arbeitete für mich mit
Was ich wollte, war zu teilen der Sitzungen mit einer frontend-und backend-API, durch redis.
Separate Maschinen, teilen gleichen DB. Sitzungen erstellt werden und der Benutzer angemeldet, wenn Sie öffnen die Seite über das frontend, dann der api sieht der angemeldete Benutzer auf Anfragen.
Hinweis: ich habe die cookie.sichern false so kann ich testen ohne https lokal.
Das war der code, den ich ursprünglich gefunden, aber es hat nicht ganz funktioniert. Nicht sicher, warum. Ich kann versuchen, und fügen Sie es in
InformationsquelleAutor Eivind
Dies kann funktionieren, express-4 /- Buchse.io-1.X
Ich schnappte mir diese code-form https://github.com/turbonetix/bus.io/blob/master/demo/chat/app.js
InformationsquelleAutor Nathan Romano
express 4.13.4 /- Buchse.io 1.4.5
Ich durchsuchen Sie alle Lösungen und Module, die aber nicht in meiner app.
Endlich -
arbeiten wie ein Charme.
InformationsquelleAutor xbtc
es gab mir eine harte Zeit, die richtige Lösung zu finden. Hier ist was für mich funktioniert :
express-4.2.0 /- Buchse.io 1.0.6
InformationsquelleAutor Peter V
express-Buchse.io-Sitzung ist eine fertige Lösung für Ihr problem. Normalerweise wird die session erstellt am sockel.io Ende hat andere sid als die, die erstellt in express.js
Bevor zu wissen, die Tatsache, als ich mich durch ihn um die Lösung zu finden, fand ich etwas seltsam. Die Sitzungen erstellt von express.js Instanz zugänglich waren an der Buchse.io-end, aber das war nicht möglich für das Gegenteil. Und bald kam ich zu wissen, dass ich meinen Weg durch die Verwaltung sid, um das problem zu beheben. Aber, es wurde bereits ein Software-Paket im Umgang mit diesem Problem. Es ist gut dokumentiert und erhält die Arbeit erledigt. Hoffe es hilft
InformationsquelleAutor Rahil051