2017-01-14 18 views
1

私はsocket.ioライブラリ(JavaScript)を使用してnodejsサーバに接続するNodeWebkitクライアントを持っています。socket.io認証が最初の接続で動作しない

クライアントは、アプリケーションの起動時に接続の手順を起動しますが、クライアントのソケットが「真」に接続されている属性がありますが、サーバーは...任意の接続をacknoledgeしません。

私はsocketio-jwtを使用して接続を認証していることを知っておく必要があります。
のGithub:

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

をそれはハロー出力しますhttps://github.com/auth0/socketio-jwt

私が追加した場合ので、接続が途中で作業を行うことを知っています!

接続は何とかそれはまあ...何も...その結果、ルライブラリと認証部分をやりたくないん作られてもだから、そのイベントです。

しかし、それだけではありません。
私はアプリを再起動すると(サーバーではない)、認証はほとんどの場合動作します。それは競合状態のように振る舞います...しかし、私はそれがおそらく1つになる可能性があるのを見ていません...コードのすべての行が認証の成功コールバックのappartを実行してgetingです。

リモートサーバーとローカルホストに接続しようとしました。 私はソケット認証の他のライブラリを試しましたが、私は同じ問題を抱えています。

は、これは、サーバーのコードです:

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

サーバー側のログ「ソケットに接続しているユーザは、」示されることはありません。
idearがある場合!御時間ありがとうございます。

答えて

0

なぜ「that」がsocket.emit(クライアント)にありますか?私はあなたがsocket.ioの同じインスタンス内でそれを扱うべきだと思う - 上記と同じ 'this'を使用する

+0

あなたの答えをありがとう。上のコードに表示されていない関数の最初の行は "var that = this"です。関数のスコープを最初に保存します。したがって、最初のレベルでは、これがルートスコープであるため、「this」を使用できます。次に、私は ".on"のコールバックにあり、スコープはコールバックのスコープです。だから私は最初に "that"にスコープを保存しました。ソケットがまだ "それ"で使えるかどうかを確認しましたが、それはあります。私が言っていることは、すべて「今」と「それ」の後でまだ意味をなさないことを願っています。 ;-) – Doctor

+0

それは理にかなっています。それでは、クライアント側と同じように、チェーンを張るのではなく、サーバー側のソケットを入れ子にしてみてください。 –

関連する問題