[解決済み] 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;
});
}
});
});
関連
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み] GET] "/users/sign_out" に一致するルートはありません。
-
[解決済み] smbclient NT_STATUS_ACCESS_DENIED
-
[解決済み] Google OAuth 2 認証 - エラー: redirect_uri_mismatch
-
[解決済み] Gitのプッシュで "Authentication Failed "と表示される
-
[解決済み] socket.ioとwebsocketの違いについて
-
[解決済み】RESTful 認証
-
[解決済み】OAuth2の「暗黙の」フローはとてもうまく機能しているのに、なぜ「認証コード」フローがあるのですか?
-
[解決済み】node.jsのユーザー認証ライブラリは?
-
[解決済み] クロスオリジンリクエストにCookieを設定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] smbclient NT_STATUS_ACCESS_DENIED
-
[解決済み] LDAPサーバをベースDNとする。
-
[解決済み] GitHub アカウントのユーザー名を変更する
-
[解決済み] OpenIDとOAuthの違いは何ですか?
-
[解決済み】node.jsのユーザー認証ライブラリは?
-
[解決済み】エンドポイントとは何ですか?
-
[解決済み】Goの認証はどのように管理されているのでしょうか?[クローズド]
-
[解決済み] トークン認証とCookieの比較
-
[解決済み] クロスオリジンリクエストにCookieを設定する
-
[解決済み] ステートレス(=セッションレス)認証の場合、CSRFトークンは必要ですか?