Użyj connect-redis i używaj redis jako magazynu sesji dla wszystkich uwierzytelnionych użytkowników. Upewnij się, że podczas uwierzytelniania wysyłasz klucz (zwykle req.sessionID) do klienta. Poproś klienta o zapisanie tego klucza w pliku cookie.
Podczas połączenia przez gniazdo (lub w dowolnym momencie później) pobierz ten klucz z pliku cookie i wyślij go z powrotem na serwer. Pobierz informacje o sesji w Redis przy użyciu tego klucza. (Weź klucz)
Na przykład:
Strona serwera (z redis jako magazynem sesji):
req.session.regenerate...
res.send({rediskey: req.sessionID});
Strona klienta:
//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});
});
Po stronie serwera:
//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
jest funkcją javascript.Podobał mi się także sposób, w jaki pusherapp tworzy kanały prywatne .
Ponieważ
socket.io
ma również unikalny identyfikator socket_id dla każdego gniazda.Użyli podpisanych ciągów autoryzacji do autoryzacji użytkowników.
Jeszcze tego nie zrobiłem
socket.io
, ale myślę, że może to być całkiem interesująca koncepcja.źródło
Wiem, że jest to trochę stare, ale dla przyszłych czytelników oprócz podejścia polegającego na analizowaniu plików cookie i pobieraniu sesji z magazynu (np. Passport.socketio ) można również rozważyć podejście oparte na tokenach.
W tym przykładzie używam tokenów sieciowych JSON, które są dość standardowe. Musisz przekazać stronie klienta token, w tym przykładzie wyobraź sobie punkt końcowy uwierzytelniania, który zwraca JWT:
Teraz serwer socket.io można skonfigurować w następujący sposób:
Oprogramowanie pośredniczące socket.io-jwt oczekuje tokenu w ciągu zapytania, więc od klienta wystarczy go dołączyć podczas łączenia:
Bardziej szczegółowe wyjaśnienie na temat tej metody i plików cookie napisałem tutaj .
źródło
Oto moja próba wykonania następującego działania:
Ponieważ możesz również chcieć dodać kilka żądań API, użyjemy również protokołu http pakietu , aby zarówno HTTP, jak i gniazdo sieciowe działały na tym samym porcie.
server.js
Poniższy fragment zawiera tylko wszystko, czego potrzebujesz, aby skonfigurować poprzednie technologie. Możesz zobaczyć pełną wersję server.js, której użyłem w jednym z moich projektów tutaj .
gniazda / index.js
Nasz
socketConnectionHandler
, po prostu nie lubię umieszczać wszystkiego wewnątrz server.js (nawet jeśli można by to zrobić doskonale), zwłaszcza, że ten plik może szybko zawierać całkiem sporo kodu.Dodatkowy materiał (klient):
Po prostu bardzo podstawowa wersja tego, czym mógłby być klient JavaScript socket.io:
Bibliografia:
Po prostu nie mogłem odwołać się do kodu, więc przeniosłem go tutaj.
1: Jak skonfigurować strategie paszportowe: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration
źródło
Ten artykuł ( http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/ ) pokazuje, jak
Używając tego kodu, możesz je również pobrać z socket.io.
źródło
użyj sesji i redis między c / s
// po stronie serwera
źródło
to powinno wystarczyć
źródło