web-dev-qa-db-ja.com

Socket.IOによる認証とハンドシェイク

Socket.IOでの承認とハンドシェイクの主な機能は何だろうと思っています。私はすでに彼らのwikiとGitHubの authorizing guide を読んでいますが、まだ以下を理解していません:

  1. Socket.ioで認証はどのように機能しますか?
  2. Socket.IOのハンドシェイクとは何ですか?
  3. handshakeDataオブジェクトに何か追加できますか?

私の質問にお答えいただければ幸いです。ありがとう。

34
Joenel de Asis

編集: Socket.IO 1.0では、ミドルウェアが使用されるようになりました。承認は次のように実行できます。

_io.use(function(socket, next) {
  var handshake = socket.request;
  next();
});
_

ソケットを拒否する必要がある場合は、next()コールバックにエラーオブジェクトを渡すだけです。同じことが名前空間でも実行できます。

_io.of('/namespace').use(function(socket, next) {
  var handshake = socket.request;
  next();
});
_

Socket.IOでの承認は、コールバックによって渡されるブール値で決定される関数を通じて実行されます。この関数は、接続がハンドシェイクを試みるたびに実行され、これは次のようになります。

_io.set('authorization', function (handshake, callback) {
  callback(null, true);
});
_

関数callback()は2つのパラメーターを受け入れます。 1つ目はエラーの理由(ある場合)、2つ目のパラメーターはクライアントが接続できるかどうかを決定するブール値です。デフォルトでは承認はありません。そのため、シナリオは上記のコードサンプルに示されています。ここで、接続しているソケットはtrueで通過できます。

Socket.IOのハンドシェイクは、ハンドシェイクに関連する他の情報技術と同様です。これはネゴシエーションのプロセスであり、Socket.IOの場合、クライアントが接続できるかどうかを決定し、そうでない場合は接続を拒否します。ハンドシェイクはXHRまたはJSONPリクエストのいずれかで開始され、認証が指定されていない場合はあまり処理しませんが、handshakeデータオブジェクトで渡されるデータでは役立ちます。

最後の質問に答えるために、はい、handshakeオブジェクトに何でも追加できます。オブジェクトは_socket.handshake_オブジェクトへの同じ変数参照であり、次のようなことができます。

_io.set('authorization', function (handshake, callback) {
  handshake.foo = 'bar';
  callback(null, true);
});

io.sockets.on('connection', function(socket) {
  console.log(socket.handshake.foo); // bar
});
_

ソケットベースのプロパティを保存できるため、これは非常に便利です。これの一般的な使用法はExpressフレームワークで、Socket.IOによって渡されたCookieに基づいてセッションIDを識別できます。これにより、一致するセッションを識別できます。

63
hexacyanide

Socket.io 1.0以降、下位互換性はありますが、アドホックミドルウェアを追加するために「io.use()」を使用することをお勧めします。したがって、Nodeサーバー側:

io.use(function(socket, next){
  var joinServerParameters = JSON.parse(socket.handshake.query.joinServerParameters);
  if (joinServerParameters.token == "xxx" ){
    next();          
  } else {
    //next(new Error('Authentication error'));                  
  }
  return;       
});

クライアント側では、独自の属性をハンドシェイクに追加するには、次のようになります。

var joinServerParameters = { token: "xxx"   };    
var socket = io.connect('url' , {query: 'joinServerParameters=' + JSON.stringify(joinServerParameters)  });
10

今、私はこの簡単な方法を使用しています:

io.set('authorization', function (handshakeData, accept) {
  var domain = handshakeData.headers.referer.replace('http://','').replace('https://','').split(/[/?#]/)[0];
  if('myDomain.com'==domain)
    accept(null, true);
  else 
    return accept('Deny', false);
});
2
Diogo Garcia

私はそれが遅すぎることを知っていますが、socket.ioを使用したハンドシェイク認証に関する非常に良い記事を見つけた情報を追加したいと思います。

socket.io認証

0
Vora Ankit