Verwenden Sie connect-redis und haben Sie redis als Sitzungsspeicher für alle authentifizierten Benutzer. Stellen Sie bei der Authentifizierung sicher, dass Sie den Schlüssel (normalerweise req.sessionID) an den Client senden. Lassen Sie den Client diesen Schlüssel in einem Cookie speichern.
Bei Socket-Verbindung (oder später) holen Sie diesen Schlüssel aus dem Cookie und senden ihn an den Server zurück. Rufen Sie mit dieser Taste die Sitzungsinformationen in Redis ab. (GET-Taste)
Z.B:
Serverseite (mit Redis als Sitzungsspeicher):
req.session.regenerate...
res.send({rediskey: req.sessionID});
Client-Seite:
//store the key in a cookie
SetCookie('rediskey', <%= rediskey %>); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
//then when socket is connected, fetch the rediskey from the document.cookie and send it back to server
var socket = new io.Socket();
socket.on('connect', function() {
var rediskey = GetCookie('rediskey'); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
socket.send({rediskey: rediskey});
});
Serverseite:
//in io.on('connection')
io.on('connection', function(client) {
client.on('message', function(message) {
if(message.rediskey) {
//fetch session info from redis
redisclient.get(message.rediskey, function(e, c) {
client.user_logged_in = c.username;
});
}
});
});
GetCookie
ist Javascript-Funktion.Ich mochte auch die Art und Weise pusherapp tut private Kanäle .
Da
socket.io
hat auch eindeutige socket_id für jeden Socket.Sie verwendeten signierte Autorisierungszeichenfolgen , um Benutzer zu autorisieren.
Ich habe dies noch nicht gespiegelt
socket.io
, aber ich denke, es könnte ein ziemlich interessantes Konzept sein.quelle
Ich weiß, dass dies etwas alt ist, aber für zukünftige Leser könnten Sie neben dem Ansatz, Cookies zu analysieren und die Sitzung aus dem Speicher abzurufen (z. B. passport.socketio ), auch einen tokenbasierten Ansatz in Betracht ziehen.
In diesem Beispiel verwende ich JSON-Web-Token, die ziemlich Standard sind. Sie müssen der Client-Seite das Token geben. Stellen Sie sich in diesem Beispiel einen Authentifizierungsendpunkt vor, der JWT zurückgibt:
Jetzt kann Ihr socket.io-Server wie folgt konfiguriert werden:
Die Middleware socket.io-jwt erwartet das Token in einer Abfragezeichenfolge, sodass Sie es vom Client nur beim Herstellen einer Verbindung anhängen müssen:
Ich schrieb eine ausführlichere Erklärung über diese Methode und Cookies hier .
quelle
Hier ist mein Versuch, Folgendes zum Laufen zu bringen:
Da Sie möglicherweise auch einige API-Anforderungen hinzufügen möchten, verwenden wir auch das http- Paket, damit sowohl HTTP als auch Web-Socket am selben Port arbeiten.
server.js
Der folgende Auszug enthält nur alles, was Sie zum Einrichten der vorherigen Technologien benötigen. Hier können Sie die vollständige Version von server.js sehen, die ich in einem meiner Projekte verwendet habe .
sockets / index.js
Wir
socketConnectionHandler
mögen es einfach nicht, alles in server.js zu platzieren (obwohl Sie es perfekt könnten), zumal diese Datei ziemlich schnell eine Menge Code enthalten kann.Zusätzliches Material (Kunde):
Nur eine sehr einfache Version dessen, was der JavaScript-Client socket.io sein könnte:
Verweise:
Ich konnte im Code einfach nicht referenzieren, also habe ich ihn hierher verschoben.
1: So richten Sie Ihre Passport-Strategien ein: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration
quelle
Dieser Artikel ( http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/ ) zeigt, wie es geht
Mit diesem Code können Sie sie auch in socket.io abrufen.
quelle
benutze session und redis zwischen c / s
// Serverseite
quelle
das sollte es tun
quelle