18

HTTP Basic を使用して認証する Node.js ベースの https サーバーを使用しています (データは SSL 暗号化接続を介して送信されるので問題ありません)。

今、私は Socket.io 接続を提供したいと考えています。

  1. 暗号化され、
  2. 認証されたユーザーのみ。

問題は、これをどのように行うかです。ソケットに接続するときにクライアント JavaScript コードで指定する必要があることは既にわかりましたが{ secure: true }、ソケット接続が SSL 経由でのみ実行され、認証されたユーザーに対してのみ機能することをサーバー側で強制するにはどうすればよいですか?

Socket.ioサーバーはhttpsサーバーのみにバインドされているため、SSLのことは簡単な部分であると思います。したがって、SSLのみを使用して実行する必要があり、(さらに)実行中のhttpサーバー上で実行する可能性はないはずです。 、 右?

もう1つのことに関しては、HTTP Basicを使用してユーザーが正常に認証された場合にのみソケット接続を確立できるようにする方法について、私は少しも考えていません。

何か案は?

4

3 に答える 3

22

編集:もちろん、OPは他の答えで正しいです。さらに、 socket.io >1.0 ではsocket.io-express-session を使用できます。

元の答え:

Socket.io は、io.set('authorization', callback)メカニズムによる承認をサポートしています。関連ドキュメントを参照してください: Authorizing。簡単な例を次に示します (これは、Cookie ベースのセッションと接続/高速セッション ストアを使用して認証します。他に何か必要な場合は、別の「承認」ハンドラーを実装するだけです)。

var utils = require('connect').utils;

// Set up a session store of some kind
var sessionId = 'some id';
var sessionStore = new MemoryStore();
// Make express app use the session store
app.use(express.session({store: sessionStore, key: sessionId});

io.configure(function () {
    io.set('authorization', function (handshakeData, callback) {
        var cookie = utils.parseCookie(handshakeData.headers.cookie);

        if(!(sessionId in cookie)) {
            return callback(null, false);
        }

        sessionStore.get(cookie[sessionId], function (err, session) {
            if(err) {
                return callback(err);
            }

            if(!('user' in session)) {
                return callback(null, false);
            }

            // This is an authenticated user!
            // Store the session on handshakeData, it will be available in connection handler
            handshakeData.session = session;

            callback(null, true);
        });
    });
});
于 2013-01-30T13:38:33.080 に答える
6

Linus の答えは基本的に正しいですが、session.socket.ioを使用してより簡単な方法で解決しました。これは基本的に同じことを行いますが、記述するカスタム コードがはるかに少なくなります。

于 2013-11-16T10:10:03.133 に答える
4
  1. ソケットを保護するように設定するには、次のようにします。

    • セキュアフラグの設定 - あなたが書いたように ({secure: true})
    • または、サーバーの作成時に (http ではなく) https プロトコルを使用する - これにより、secure フラグが自動的に true に設定されます。
  2. 認証プロセスを簡素化する適切なライブラリは次のとおりです: https://github.com/auth0/socketio-jwt

于 2017-06-13T08:03:24.527 に答える