8

ブラウザ環境で実行されていないクライアントも存在する必要があるため、必ずしもCookieを使用せず、express.jsを回避せずに、node.jsおよびsocket.ioを介してWebSocketを介してセッション処理を行いたいと思います。誰かがすでにこれを行ったのですか、それとも概念実証の経験がありますか?

4

2 に答える 2

3

socket.io 接続が確立される前に、ハンドシェイク メカニズムがあり、デフォルトでは、すべての適切な着信要求が正常にハンドシェイクされます。ただし、ハンドシェイク中にソケット データを取得し、着信接続要求を受け入れるか拒否するかの選択に応じて true または false を返すメソッドがあります。socket.io docs の例を次に示します。

handshakeData は認証後に保存されるため、実際にこのオブジェクトにデータを追加または削除できます。

var io = require('socket.io').listen(80);

io.configure(function (){
  io.set('authorization', function (handshakeData, callback) {
    // findDatabyip is an async example function
    findDatabyIP(handshakeData.address.address, function (err, data) {
      if (err) return callback(err);

      if (data.authorized) {
        handshakeData.foo = 'bar';
        for(var prop in data) handshakeData[prop] = data[prop];
        callback(null, true);
      } else {
        callback(null, false);
      }
    }) 
  });
});

コールバック関数の最初の引数はエラーです。null に設定されていない場合、クライアントを自動的に拒否する文字列をここに指定できます。2 番目の引数は、着信要求を受け入れるかどうかに関係なく、ブール値です。

于 2012-12-04T10:23:07.540 に答える
1

これは役立つはずです。https://github.com/LearnBoost/socket.io/wiki/Authorizing

すべてのセッション変数を追跡し、handshakeDataで利用可能な以下の組み合わせを使用してユーザーを一意に識別することができます

{
   headers: req.headers       // <Object> the headers of the request
 , time: (new Date) +''       // <String> date time of the connection
 , address: socket.address()  // <Object> remoteAddress and remotePort object
 , xdomain: !!headers.origin  // <Boolean> was it a cross domain request?
 , secure: socket.secure      // <Boolean> https connection
 , issued: +date              // <Number> EPOCH of when the handshake was created
 , url: request.url          // <String> the entrance path of the request
 , query: data.query          // <Object> the result of url.parse().query or a empty object
}

この例も同様に役立つ場合があります。ブラウザ以外のクライアントに別の方法で情報を提供させるだけです。

SocketIO + MySQL 認証

于 2012-08-26T06:25:57.337 に答える