J'utilise un framework express. Je souhaite accéder aux données de session depuis socket.io. J'ai essayé express dynamicHelpers avec les données client.listener.server.dynamicViewHelpers, mais je ne peux pas obtenir les données de session. Existe-t-il un moyen simple de le faire? S'il vous plaît voir le 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
});
});
Réponses:
Cela ne fonctionnera pas pour les sockets passant par le transport flashsocket (cela n'envoie pas au serveur les cookies nécessaires) mais cela fonctionne de manière fiable pour tout le reste. Je viens de désactiver le transport flashsocket dans mon code.
Pour le faire fonctionner, du côté express / connect, je définis explicitement le magasin de session afin de pouvoir l'utiliser dans le socket:
Ensuite, dans mon code de socket, j'inclus le framework de connexion afin que je puisse utiliser son analyse de cookie pour récupérer le connect.sid des cookies. Je recherche ensuite la session dans le magasin de sessions qui a ce connect.sid comme ceci:
Vous pouvez ensuite utiliser la session selon vos besoins.
la source
La solution de module Socket.IO-sessions expose l'application aux attaques XSS en exposant l'ID de session au niveau du client (script).
Vérifiez plutôt cette solution (pour Socket.IO> = v0.7). Consultez la documentation ici .
la source
socket.io
est ce qui expose l'ID de session, pas ce module. Ce n'est pas un gros problème puisque l'ID de session est stocké côté client dans un cookie de toute façon ... De plus, ce tutoriel ne fonctionne pas pour la dernière version d'Express.socket.io
page github ..?Je suggère de ne pas réinventer entièrement la roue. Les outils dont vous avez besoin sont déjà un package npm.Je pense que c'est ce dont vous avez besoin: session.socket.io Je l'utilise ces jours-ci et ce sera très utile je suppose !! Lier la session express à la couche socket.io aura tellement d'avantages!
la source
Edit: Après avoir essayé des modules qui ne fonctionnaient pas, j'ai en fait écrit ma propre bibliothèque pour ce faire. Prise sans vergogne: allez le vérifier sur https://github.com/aviddiviner/Socket.IO-sessions . Je laisserai mon ancien message ci-dessous à des fins historiques:
Je suis tout à fait ce travail d'une manière ordonnée sans avoir à contourner le flashsocket de transport selon pr0zac la solution « ci - dessus. J'utilise également express avec Socket.IO. Voici comment.
Commencez par transmettre l'ID de session à la vue:
Ensuite, dans votre vue, liez-le avec Socket.IO côté client:
Ensuite, dans votre écouteur Socket.IO côté serveur, récupérez-le et lisez / écrivez les données de session:
Dans mon cas, mon
session_store
est Redis, en utilisant laredis-connect
bibliothèque.J'espère que cela aide quelqu'un qui trouve ce message lors d'une recherche sur Google (comme je l'ai fait;)
la source
Voir ceci: Authentification Socket.IO
Je suggérerais de ne rien chercher via
client.request...
ouclient.listener...
car cela n'est pas directement attaché à l'client
objet et pointer toujours vers le dernier utilisateur connecté!la source
Découvrez Socket.IO-connect
Connectez le WebSocket Middleware Wrapper autour du nœud Socket.IO https://github.com/bnoguchi/Socket.IO-connect
Cela vous permettra de pousser la ou les requêtes Socket.IO vers le bas de la pile middleware Express / Connect avant de les traiter avec les gestionnaires d'événements Socket.IO, vous donnant ainsi accès à la session, aux cookies, etc. Cependant, je ne suis pas sûr que cela fonctionne avec tous les transports de Socket.IO.
la source
Vous pouvez utiliser express-socket.io-session .
Partagez un middleware de session express basé sur des cookies avec socket.io. Fonctionne avec express> 4.0.0 et socket.io> 1.0.0 et ne sera pas rétrocompatible.
A travaillé pour moi !!
la source
Vous pouvez jeter un œil à ceci: https://github.com/bmeck/session-web-sockets
ou vous pouvez également utiliser:
J'espère que cela t'aides.
la source
Je ne suis pas sûr de faire les choses correctement. https://github.com/LearnBoost/socket.io/wiki/Authorizing
Avec les données de poignée de main, vous pouvez accéder aux cookies. Et dans les cookies, vous pouvez récupérer connect.sid qui est l'identifiant de session pour chaque client. Et puis utilisez le connect.sid pour obtenir les données de session de la base de données (je suppose que vous utilisez RedisStore)
la source