2017-01-14 3 views
1

J'ai un client NodeWebkit qui se connecte à un serveur nodejs en utilisant la bibliothèque socket.io (JavaScript).L'authentification socket.io ne fonctionne pas lors de la première connexion

Le client lance la procédure de connexion au démarrage de l'application mais le serveur n'accepte aucune connexion ... Bien que l'attribut connecté soit défini sur "true" dans la socket du client.

Vous devez savoir que j'utilise socketio-jwt pour authentifier la connexion.
Github: https://github.com/auth0/socketio-jwt

Je sais que la connexion fonctionne d'une manière parce que si j'ajouter:

io.sockets.on('connection', function(){console.log("hello");}) 

Il imprime bonjour!

Donc, il semble que l'événement si la connexion est en quelque sorte faite, il ne veut pas faire la partie auth avec la bibliothèque de fichiers, ce qui entraîne ... Eh bien ... Rien.

Mais ce n'est pas tout !!
Parce que si je redémarre l'application (pas le serveur) alors l'auth fonctionne la plupart du temps! Il agit comme une condition de course ... Mais je ne vois pas comment il pourrait en être un ... Chaque ligne de code est en train d'être exécutée avec le rappel de succès de l'authentification.

J'ai essayé de me connecter à un serveur distant et sur mon hôte local. J'ai également essayé avec une autre bibliothèque de socket auth mais j'ai le même problème.

Voici le code du serveur:

var session = require('express-session'); 
var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var socketioJwt = require('socketio-jwt'); 

io.sockets.on('connection', socketioJwt.authorize({ 
    secret: 'some secret', 
    timeout: 15000 // 15 seconds to send the authentication message 
})).on('authenticated', function (socket) { 

    console.log('[Info]: A user connected to socket = ', socket.decoded_token); 

}); 
}); 



http.listen(5000, function() { 
     console.log('listening on *:5000'); 
}); 

Et maintenant, le code client:

this.socket = io.connect('http://' + that.hostName +':' + that.port);  
var token = jwt.sign({email: "someEail", pwd: "somePwd"}, fromServerSecret); 

this.socket.on('connect', function() { 
    that.socket.emit('authenticate', {token: token}) //send the jwt 
      .on('authenticated', function() { 

       console.log("[Info]: Socket login successfull"); 

      }) 
      .on('unauthorized', function (msg) { 
       console.log("[Warning]: Socket unauthorized: " + JSON.stringify(msg.data)); 
       throw new Error(msg.data.type); 
      }); 
}); 

Le journal côté serveur "Un utilisateur connecté à la prise" est jamais montré.
Si vous avez un idear! Merci pour votre temps.

Répondre

0

Pourquoi existe-t-il un 'that' sur socket.emit (client)? Je pense que vous devriez le gérer dans la même instance de socket.io - en utilisant la même chose que ci-dessus

+0

Merci pour votre réponse. La première ligne de ma fonction qui n'apparaît pas dans le code ci-dessus est "var that = this". Je sauvegarde la portée de la fonction au début. Donc, au premier niveau, je peux utiliser "ceci" parce que c'est la portée racine. Ensuite, je suis dans le rappel du ".on" et la portée est la portée du rappel. C'est pourquoi j'ai sauvegardé la portée dans "ça" au début. Bien que j'ai vérifié si la prise était encore disponible par "ça" et c'est le cas. J'espère que ce que je dis a encore du sens après tout cela "ceci" et "ça". ;-) – Doctor

+0

Cela a du sens. Alors peut-être vous devriez essayer d'imbriquer les sockets du côté de serveur au lieu de les enchaîner, de la même manière que vous avez fait du côté de client. –