Utilisez connect-redis et faites de redis votre magasin de session pour tous les utilisateurs authentifiés. Assurez-vous que lors de l'authentification, vous envoyez la clé (normalement req.sessionID) au client. Demandez au client de stocker cette clé dans un cookie.
Lors de la connexion socket (ou à tout moment plus tard), récupérez cette clé dans le cookie et renvoyez-la au serveur. Récupérez les informations de session dans redis à l'aide de cette clé. (Obtenir la clé)
Par exemple:
Côté serveur (avec redis comme magasin de session):
req.session.regenerate...
res.send({rediskey: req.sessionID});
Côté client:
//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});
});
Du côté serveur:
//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;
});
}
});
});
Shripad Krishna
la source
GetCookie
est la fonction javascript.J'ai aussi aimé la façon dont pusherapp fait des chaînes privées .
Car a également
socket.io
un socket_id unique pour chaque socket.Ils ont utilisé des chaînes d'autorisation signées pour autoriser les utilisateurs.
Je n'ai pas encore reflété cela
socket.io
, mais je pense que cela pourrait être un concept assez intéressant.la source
Je sais que c'est un peu vieux, mais pour les futurs lecteurs, en plus de l'approche d'analyse des cookies et de récupération de la session à partir du stockage (par exemple, passeport.socketio ), vous pouvez également envisager une approche basée sur des jetons.
Dans cet exemple, j'utilise des jetons Web JSON qui sont assez standard. Vous devez donner à la page client le jeton, dans cet exemple, imaginez un point de terminaison d'authentification qui renvoie JWT:
Maintenant, votre serveur socket.io peut être configuré comme suit:
Le middleware socket.io-jwt attend le jeton dans une chaîne de requête, donc du client, vous n'avez qu'à le joindre lors de la connexion:
J'ai écrit une explication plus détaillée sur cette méthode et les cookies ici .
la source
Voici ma tentative de faire fonctionner les éléments suivants:
Puisque vous voudrez peut-être également ajouter des requêtes API, nous utiliserons également le package http pour que HTTP et Web socket fonctionnent sur le même port.
server.js
L'extrait suivant comprend uniquement tout ce dont vous avez besoin pour configurer les technologies précédentes. Vous pouvez voir la version complète de server.js que j'ai utilisée dans l'un de mes projets ici .
sockets / index.js
Notre
socketConnectionHandler
, je n'aime tout simplement pas tout mettre dans server.js (même si vous le pouvez parfaitement), d'autant plus que ce fichier peut finir par contenir beaucoup de code assez rapidement.Matériel supplémentaire (client):
Juste une version très basique de ce que pourrait être le client JavaScript socket.io:
Références:
Je ne pouvais tout simplement pas faire référence à l'intérieur du code, alors je l'ai déplacé ici.
1: Comment configurer vos stratégies Passport: https://scotch.io/tutorials/easy-node-authentication-setup-and-local#handling-signupregistration
la source
Cet article ( http://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/ ) montre comment
En utilisant ce code, vous pouvez également les obtenir dans socket.io.
la source
utiliser session et redis entre c / s
// du côté serveur
la source
cela devrait le faire
la source