1. ホーム
  2. authentication

[解決済み] Socket.IO 認証

2022-07-05 11:20:41

質問

Node.jsでSocket.IOを使用しようとしており、サーバーがSocket.IOクライアントそれぞれにIDを付与できるようにしようとしています。 ソケットコードはhttpサーバーコードの範囲外であるため、送信されたリクエスト情報に簡単にアクセスできないので、接続中に送信する必要があると想定しています。 最適な方法は何でしょうか?

1) Socket.IOを介して誰が接続しているかについての情報をサーバーに取得する。

2) 接続者が誰であるかを認証する (現在 Express を使用していますが、その方が簡単でしょう)

解決方法は?

connect-redisを使用し、認証されたすべてのユーザーのセッションストアとしてredisを使用します。認証時に、キー(通常はreq.sessionID)をクライアントに送信することを確認します。クライアントはこのキーをクッキーに保存するようにします。

ソケット接続時(またはそれ以降)に、クッキーからこのキーを取得し、サーバーに送り返します。このキーを使って、redisにあるセッション情報を取得します。(キーをGET)

例えば

サーバーサイド(redisをセッションストアとして使用)。

req.session.regenerate...
res.send({rediskey: req.sessionID});

クライアント側です。

//store the key in a cookie
SetCookie('rediskey', <%= rediskey %>); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx

//then when socket is connected, fetch the rediskey from the document.cookie and send it back to server
var socket = new io.Socket();

socket.on('connect', function() {
  var rediskey = GetCookie('rediskey'); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
  socket.send({rediskey: rediskey});
});

サーバー側です。

//in io.on('connection')
io.on('connection', function(client) {
  client.on('message', function(message) {

    if(message.rediskey) {
      //fetch session info from redis
      redisclient.get(message.rediskey, function(e, c) {
        client.user_logged_in = c.username;
      });
    }

  });
});