2017-01-14 9 views
1

У меня есть клиент NodeWebkit, который подключается к серверу nodejs, используя библиотеку socket.io (JavaScript).socket.io аутентификация не работает при первом подключении

Клиент запускает процедуру подключения при запуске приложения, но сервер не выполняет никаких подключений ... Хотя сокет клиента имеет связанный атрибут с «истинным».

Вы должны знать, что я использую socketio-jwt для аутентификации соединения.
Github: https://github.com/auth0/socketio-jwt

Я знаю, что связь делает работу таким образом, потому что, если я добавлю:

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

Он печатает привет!

Так что кажется, что событие, хотя соединение каким-то образом заставило его не хотеть делать часть auth с библиотекой, в результате чего ... Ну ... Ничего.

Но это еще не все!
Потому что если я перезагружаю приложение (а не сервер), то auth работает большую часть времени! Он действует как состояние гонки ... Но я не вижу, как это может быть возможно ... Каждая строка кода запускает выполненную команду успешного обратного вызова аутентификации.

Я попытался подключиться к удаленному серверу и локальному хосту. Я также пробовал с другой библиотекой socket auth, но у меня такая же проблема.

Это код сервера:

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'); 
}); 

И теперь код клиента:

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); 
      }); 
}); 

Сервер сторона журнала «Пользователь подключается к гнезду» никогда не показывается.
Если у вас есть простуда! Спасибо за ваше время.

ответ

0

Почему существует функция «this» на socket.emit (client)? Я думаю, вы должны обращаться с ним в том же экземпляре socket.io - используя те же «это», что и выше

+0

Спасибо за ваш ответ. Первая строка моей функции, которая не отображается в приведенном выше коде, это «var that = this». Я сохраняю область действия в начале. Таким образом, на первом уровне я могу использовать «это», потому что это область корня. Затем я получаю обратный вызов «.on», а область действия - область обратного вызова. Вот почему я сохранил область действия в «этом» в начале. Хотя я проверил, был ли сокет еще доступным через «это», и это так. Надеюсь, что то, что я говорю, все еще имеет смысл после всех этих «этого» и «этого». ;-) – Doctor

+0

Это имеет смысл. Тогда, возможно, вам следует попытаться вложить сокеты на серверной стороне, а не связывать их так же, как на стороне клиента. –