私は、HTTP Basic を使用して認証する Node.js ベースの https サーバーを使用しています (データは SSL 暗号化接続を介して送信されるため、問題ありません)。
ここで、Socket.io接続を提供したいと思います。
- 暗号化され
- 認証されたユーザーのみ対象です。
問題は、これをどうやって行うかということです。{ secure: true }
ソケットに接続するときにクライアントの JavaScript コードで指定する必要があることはすでにわかっていますが、ソケット接続が SSL 経由でのみ実行され、認証されたユーザーに対してのみ機能することをサーバー側で強制するにはどうすればよいでしょうか。
Socket.io サーバーは https サーバーのみにバインドされているため、SSL の問題は簡単な部分だと思います。したがって、SSL のみを使用して実行し、(追加で) 実行中の http サーバー経由で実行することは不可能であるはずです。
もう 1 つに関しては、ユーザーが HTTP Basic を使用して正常に認証された場合にのみソケット接続を確立できるようにする方法についてはまったくわかりません。
何か案は?
ベストアンサー1
編集:もちろん、OPの他の回答は正しいです。さらに、socket.io >1.0では、socket.io-express-セッション。
元の回答:
Socket.io はメカニズムによる認証をサポートしていますio.set('authorization', callback)
。関連ドキュメントを参照してください:承認以下に簡単な例を示します (これは、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);
});
});
});