Używam Express Framework. Chcę uzyskać dostęp do danych sesji z socket.io. Próbowałem wyrazić dynamicHelpers z danymi client.listener.server.dynamicViewHelpers, ale nie mogę uzyskać danych sesji. Czy jest na to prosty sposób? Proszę zobaczyć kod
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
});
});
Odpowiedzi:
To nie zadziała dla gniazd przechodzących przez transport flashsocket (nie wysyła do serwera potrzebnych plików cookie), ale działa niezawodnie w przypadku wszystkiego innego. Po prostu wyłączam transport flashsocket w moim kodzie.
Aby to zadziałało, po stronie express / connect wyraźnie definiuję magazyn sesji, aby móc go używać w gnieździe:
Następnie w kodzie gniazda dołączam strukturę connect, dzięki czemu mogę użyć analizy plików cookie w celu pobrania connect.sid z plików cookie. Następnie wyszukuję sesję w magazynie sesji, który ma to connect.sid w następujący sposób:
Następnie możesz korzystać z sesji w razie potrzeby.
źródło
Rozwiązanie modułu Socket.IO-session naraża aplikację na ataki XSS, ujawniając identyfikator sesji na poziomie klienta (skryptów).
Zamiast tego sprawdź to rozwiązanie (dla Socket.IO> = v0.7). Zobacz dokumentację tutaj .
źródło
socket.io
jest tym, co ujawnia identyfikator sesji, a nie ten moduł. Nie jest to wielka sprawa, ponieważ identyfikator sesji i tak jest przechowywany po stronie klienta w pliku cookie ... Również ten samouczek nie działa w najnowszej wersji Express.socket.io
strony github ..?Proponuję nie wymyślać całkowicie koła na nowo. Narzędzia, których potrzebujesz, to już pakiet npm. Myślę, że właśnie tego potrzebujesz: session.socket.io Używam go w tych dniach i myślę, że będzie bardzo pomocny !! Połączenie sesji ekspresowej z warstwą socket.io będzie miało wiele zalet!
źródło
Edycja: Po wypróbowaniu niektórych modułów, które nie działały, napisałem własną bibliotekę, aby to zrobić. Bezwstydna wtyczka: sprawdź to na https://github.com/aviddiviner/Socket.IO-sessions . Zostawię mój stary post poniżej w celach historycznych:
Otrzymałem tę pracę całkiem dobrze, bez konieczności omijania transportu flashsocket, jak w rozwiązaniu pr0zac powyżej. Używam również Express z Socket.IO. Oto jak.
Najpierw przekaż identyfikator sesji do widoku:
Następnie w swoim widoku połącz go ze stroną klienta Socket.IO:
Następnie w odbiorniku Socket.IO po stronie serwera, podnieś go i przeczytaj / zapisz dane sesji:
W moim przypadku mój
session_store
to Redis, korzystając zredis-connect
biblioteki.Mam nadzieję, że pomoże to komuś, kto znajdzie ten post podczas wyszukiwania w Google (tak jak ja;)
źródło
Zobacz to: Uwierzytelnianie Socket.IO
Sugerowałbym, aby nie pobierać niczego za pośrednictwem
client.request...
lub,client.listener...
ponieważ nie jest to bezpośrednio dołączone doclient
obiektu i zawsze wskazuje na ostatnio zalogowanego użytkownika!źródło
Sprawdź Socket.IO-connect
Połącz WebSocket Middleware Wrapper Around Socket.IO-node https://github.com/bnoguchi/Socket.IO-connect
Pozwoli to na wypchnięcie żądań Socket.IO w dół stosu oprogramowania pośredniego Express / Connect przed obsłużeniem go za pomocą programów obsługi zdarzeń Socket.IO, zapewniając dostęp do sesji, plików cookie i nie tylko. Chociaż nie jestem pewien, czy działa to ze wszystkimi transportami Socket.IO.
źródło
Możesz skorzystać z express-socket.io-session .
Udostępnij oprogramowanie pośredniczące sesji ekspresowej opartej na plikach cookie z socket.io. Działa z express> 4.0.0 i socket.io> 1.0.0 i nie będzie kompatybilny wstecz.
Pracował dla mnie !!
źródło
Możesz rzucić okiem na to: https://github.com/bmeck/session-web-sockets
lub alternatywnie możesz użyć:
Mam nadzieję że to pomoże.
źródło
Nie jestem pewien, czy robię to dobrze. https://github.com/LearnBoost/socket.io/wiki/Authorizing
Dane dotyczące uzgadniania umożliwiają dostęp do plików cookie. W plikach cookie możesz pobrać connect.sid, który jest identyfikatorem sesji dla każdego klienta. A następnie użyj connect.sid, aby pobrać dane sesji z bazy danych (zakładam, że używasz RedisStore)
źródło