Ich benutze Express Framework. Ich möchte Sitzungsdaten von socket.io erreichen. Ich habe versucht, dynamicHelpers mit client.listener.server.dynamicViewHelpers-Daten auszudrücken, aber ich kann keine Sitzungsdaten abrufen. Gibt es eine einfache Möglichkeit, dies zu tun? Bitte beachten Sie den Code
app.listen(3000);
var io = require('socket.io');
var io = io.listen(app);
io.on('connection', function(client){
// I want to use session data here
client.on('message', function(message){
// or here
});
client.on('disconnect', function(){
// or here
});
});
Antworten:
Dies funktioniert nicht für Sockets, die über den Flashsocket-Transport gehen (es sendet dem Server nicht die erforderlichen Cookies), aber es funktioniert zuverlässig für alles andere. Ich deaktiviere nur den Flashsocket-Transport in meinem Code.
Damit es funktioniert, definiere ich auf der Express / Connect-Seite explizit den Sitzungsspeicher, damit ich ihn im Socket verwenden kann:
Dann füge ich in meinen Socket-Code das Connect-Framework ein, damit ich mithilfe der Cookie-Analyse die connect.sid aus den Cookies abrufen kann. Ich schaue dann die Sitzung im Sitzungsspeicher nach, der diese connect.sid hat:
Sie können die Sitzung dann nach Bedarf verwenden.
quelle
Die Socket.IO-Sessions-Modullösung setzt die App XSS-Angriffen aus, indem die Sitzungs-ID auf Client-Ebene (Skripterstellung) verfügbar gemacht wird.
Überprüfen Sie stattdessen diese Lösung (für Socket.IO> = v0.7). Siehe Dokumente hier .
quelle
socket.io
ist das, was die Sitzungs-ID verfügbar macht, nicht dieses Modul. Dies ist keine große Sache, da die Sitzungs-ID sowieso clientseitig in einem Cookie gespeichert wird ... Auch dieses Tutorial funktioniert nicht für die neueste Version von Express.socket.io
Lösungslink leitet einfach zur Github-Seite weiter.Ich schlage vor, das Rad nicht komplett neu zu erfinden. Die Tools, die Sie benötigen, sind bereits ein npm-Paket. Ich denke, das ist, was Sie brauchen: session.socket.io Ich benutze es in diesen Tagen und es wird sehr hilfreich sein, denke ich !! Das Verknüpfen der Express-Sitzung mit der socket.io-Ebene hat so viele Vorteile!
quelle
Bearbeiten: Nachdem ich einige Module ausprobiert habe, die nicht funktionierten, habe ich tatsächlich meine eigene Bibliothek geschrieben, um dies zu tun. Schamloser Stecker: Schauen Sie unter https://github.com/aviddiviner/Socket.IO-sessions nach . Ich werde meinen alten Beitrag unten aus historischen Gründen verlassen:
Ich habe diese Arbeit ganz ordentlich bekommen, ohne den Flashsocket- Transport gemäß der obigen Lösung von pr0zac umgehen zu müssen . Ich benutze auch Express mit Socket.IO. Hier ist wie.
Übergeben Sie zunächst die Sitzungs-ID an die Ansicht:
Verknüpfen Sie es dann Ihrer Ansicht nach mit Socket.IO clientseitig:
Nehmen Sie es dann in Ihrem serverseitigen Socket.IO-Listener auf und lesen / schreiben Sie die Sitzungsdaten:
In meinem Fall ist mein
session_store
Redis, der dieredis-connect
Bibliothek benutzt.Hoffe, das hilft jemandem, der diesen Beitrag bei der Suche in Google findet (wie ich;)
quelle
Sieh dir das an: Socket.IO-Authentifizierung
Ich würde vorschlagen, nichts über
client.request...
oder abzurufen,client.listener...
da dies nicht direkt mit demclient
Objekt verbunden ist und immer auf den zuletzt angemeldeten Benutzer verweist!quelle
Auschecken Socket.IO-connect an
Verbinden Sie den WebSocket Middleware Wrapper mit dem Socket.IO-Knoten https://github.com/bnoguchi/Socket.IO-connect
Auf diese Weise können Sie die Socket.IO-Anforderung (en) in den Express / Connect-Middleware-Stack verschieben, bevor Sie sie mit Socket.IO-Ereignishandlern bearbeiten, um auf die Sitzung, Cookies und mehr zuzugreifen. Ich bin mir jedoch nicht sicher, ob es mit allen Transporten von Socket.IO funktioniert.
quelle
Sie können express-socket.io-session verwenden .
Teilen Sie eine Cookie-basierte Express-Session-Middleware mit socket.io. Funktioniert mit Express> 4.0.0 und socket.io> 1.0.0 und ist nicht abwärtskompatibel.
Hat für mich gearbeitet !!
quelle
Sie können dies überprüfen : https://github.com/bmeck/session-web-sockets
oder alternativ können Sie verwenden:
Hoffe das hilft.
quelle
Ich bin mir nicht sicher, ob ich es richtig mache. https://github.com/LearnBoost/socket.io/wiki/Authorizing
Mit den Handshake-Daten können Sie auf die Cookies zugreifen. Und in den Cookies können Sie connect.sid abrufen, die die Sitzungs-ID für jeden Client ist. Verwenden Sie dann die Datei connect.sid, um die Sitzungsdaten aus der Datenbank abzurufen (ich gehe davon aus, dass Sie RedisStore verwenden).
quelle