Salut,

J'ai une application qui fait l'authentification des membres.

Quand un membre arrive sur la page login.php, un socket lui est attribué.
Quand le membre valide le formulaire avec ses bons identifiants, le socket prend en attribut l'id du membre qui sera géré comme une variable de session, ensuite il est ajouté dans un tableau des membres connectés avec " users = []; " et redirigé vers la page membre.

C'est à la suite de cette redirection que le membre se déconnecte du serveur mais pas du site, juste du serveur.

J'aimerais savoir comment faire pour que le membre reste connecté au serveur et donc à son socket après redirection.
J'ai cherché avec express et je n'ai pas trouvé de tuto ou d'aide :(

Merci d'avance

17 réponses


Pourquoi as-tu besoin qu'il reste connecté ?
Je m'y connais pas trop trop, mais je ne crois pas que ce soit possible de garder la connexion, car il change de page, après je ne sais pas, je pense qu'il faut faire au cas par cas, donc il me faudrait que tu me dises ton cas (ou si qqn a une meilleure réponse)

Nikola
Auteur

En fait, je récupère dans le tableau des membres connectés, les id et les infos des membres pour faire une liste de membres connectés.
Si ils changent de page et se déconnecte, la liste s'actualisera et supprimera les membres qui sont pourtant encore connectés.

Je sais pas si j'ai été clair ^^

Nikola
Auteur

Voici un code de test simple qui fonctionne si on valide un formulaire avec juste une adresse email :

// COTE SERVEUR :

io.sockets.on('connection', function(socket){
    socket.on('login', function(data){
        socket.email = data.email;
        logged[data.email] = data.email;
        console.log('Connected : '+socket.email);
        socket.emit('user');
        socket.broadcast.emit('msg', 'Un membre vient de se connecter : '+socket.email);
    });
    socket.on('disconnect', function(){
        if(logged[socket.email]){
            delete logged[socket.email];
            console.log('Disconnected : '+socket.email);
        }
    });
});

// COTE CLIENT :

    $('#form_login').on('submit',function(e){
        e.preventDefault();
        var email = $('#email').val();
        data = {email};
        socket.emit('login', data);
        socket.on('user', function(){
            $(location).attr('href','../home');
        });
        socket.on('msg', function(msg){
            $('body').html(msg);
        });
    });

Le " socket.emit('user') " renvois une redirection vers la page membre avec " $(location).attr('href','../home'); "
et fait la déconnexion directement du socket des membres :(
Et le message ne s'envois pas aux membres déjà connectés à cause de cette redirection :(

Mais tu veux faire quoi exactement ? Tu veux que lorsqu'un utilisateur se connecte sur ta page login.php, il soit redirigé vers ta page home, et que lorsqu'il arrive sur la page home, il lui affiche qu'il est connecté ?

Nikola
Auteur

Oui, c'est ça, dsl d'avoir été long à expliquer ^^

Alors voyons ca,
tu pourrais rajouter un deuxieme tableau genre connexion du même genre que logged
et que lorsqu'il se login tu mets le mec dans connexion et pas dans logged
et quand il arrive sur la page home, tu envoies au nodejs un event genre redirected
et ton nodejs passe le compte de connexion dans logged et envoie le message ?

Nikola
Auteur

C'est compliqué sans code ^^ je comprend moyen

Je ne peux pas coder maintenant, j'essayerai d'y regarder au soir ;)

Salut. As tu essayé via socket.io? il te suffit de le declarer en tant que dépendance dans ton package.json , de le telecharger dans ton dossier local via npm et ensuite de le glisser en haut de ton javascript: ceci est surtout interessant pour les applis de chat en utilisant nodeJs avec un run time tres court, je ne sais pas si cela s'applique à ton cas ici:

var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server),

Justement il utilise socket.io, ce qu'il veut c'est que le socket de socket.io reste connecté quand il change de page ;)

Nikola
Auteur

Oui ;)
J'ai une redirection vers la page membre avec jQuery, et après la redirection, le socket se déconnecte, et j'ai un message déconnexion

Bonjour, j'imagine que tu parles de websocket...

si tu changes de page, la socket sera automatiquement fermée, ce qui est un comportement normal de la part du navigateur.

Cependant je n'ai pas tout à fait compris l'intérêt de la websocket sur la page de connexion ?
Le login et le mot de passe circule par cette websocket? Si oui quel en est l'intérêt?

Par ailleurs, le fait d'utiliser les websockets dans une appli change drastiquement l'architecture que l'on peut donner à cette appli et pose des contraintes fortes. Greffer ce système sur un existant peut s'avérer très laborieux si le contexte est hostile à leurs utilisations.

Enfin, il me faudrait plus d'éléments pour parvenir à mettre en place une solution:

Quel est le rôle de cette websocket? A quelle exigence fonctionnelle est-elle censée contribuer?
Combien de serveurs? (php et node ?)
Comment est géré la sécurité? session ?

Une fois dans la zone membre, que peut faire l'utilisateur?

Dans l'attente de tes réponses.

cordialement

Antho

Nikola
Auteur

Finalement, avec ce que tu ma dit, je vais me fier a tes conseils :
Je fais un espace membre en php, et jai donc un serveur apache + php et serveur node.
j'aimerais juste que dès que la redirection se fais sur la page membre, une notification apparaisse a tout le monde du style : Prénom et Nom vient de se connecter.
Ensuite l'utilisation de websocket me serais utile pour l'envois et l'affichage en temps reel de messages, d'actualités et notifications.

Voila le but de ce que je veux faire, si tu as des conseils pour faire ca, merci d'avance :-)

Bonjour,

le problème est que ton site n'est pas full ajax voir même pas du tout. Donc à chaque chargement de page, une socket est fermée puis une autre est ouverte. Je pense que tu essayes de greffer un système de notifications sur un existant sans l'avoir envisager au départ. Or cette fonctionnalité supplémentaire aurait dû changer la manière de fonctionner de ton site pour justement ne pas se retrouver à socket land.
Cela étant dit :

Comment sécurises-tu cet accès au serveur node? J'imagine que la connexion elle se fait grâce au serveur php ?

Comment vas-tu différencier qqun qui arrive sur la page d'accueil de l'espace membre de quelqu'un qui revient sur la page d'accueil? =>Parce que tu ne peux pas le faire depuis la page login si ta redirection a lieu avec un header location...

Une fois connectée, as-tu besoin de différencier les utilisateurs sur le serveur node? Comment vas-tu gérer la reconnexion au serveur node de manière sécurisée à chaque chargement de page?

Quel est exactement le besoin concernant tout ce système? il n'y a pas assez d'éléments ...

Nikola
Auteur

Bonjour,

Je ne sais pas comment sécurisé l'accès au serveur node. Et oui la connexion à l'espace membre se fait avec php
C'est pareil pour quelqu'un qui se connecte à l'espace membre et quelqu'un qui est déjà connecté :-(

Je ne sais pas vraiment comment faire pour tout ce que tu m'a dit :(
Mais le besoin concernant tout ca, c'est un espace membre en temps réel (Messagerie, notifications, actualités etc...)

Si une personne pourrais m'indiquer la marche à suivre, qui pourrais s'intéressé à mon projet, ca m'aiderais un peu :) mais pour l'instant j'ai trouvé des tutos pour faire des chats sur node, et ce que je veux faire c'est un peu plus compliqué.

Mon projet c'est un réseau social basé sur l'astronomie.
Chaque membre peut publier leurs actualités, observations, photos. Ils peuvent s'envoyer des messages instantanés, recevoir des notifications en temps réel.

J'avais pensé au début, utiliser mysql sans lier l'id du membre connecté à la socket ouverte.
Dès qu'une notification s'ajoute dans la base de donnée, elle s'affiche directement, mais c'est pas très propre ?

Merci d'avance pour vos conseils

Pour info, le createur de socket.io, guillermo rauch, a aussi crée engine.io, je ne sais pas si ça peut aider, je démarre avec mon apprentissage des websockets et en effet, ça a l'air interessant...

Si tu souhaites créer des sessions, créer des cookies qui expirent à la fermeture du navigateur (une session quoi...).
L'ID du websocket changera, mais tu peux générer une clé que tu stock dans ce cookie et que tu récupères afin d'identifier l'utilisateur malgré le changement d'ID du websocket après la redirection.

Ou bien tu passes par la création d'une application "one page" grâce à AngularJS par exemple (ngView).