2

シナリオ:ユーザー名とパスワードを照合し、ユーザーが認証済みページにアクセスできるようにするログイン システム ( Node.js + Express + Socket.IO ) を検討します。ログイン システムはセッション ID を Cookie としてクライアントに保存し、認証されたページ リクエストごとにサーバーで検証し、それに応じて許可/禁止します。

問題:同じユーザーが別のマシンまたはブラウザーからログインしたとします。前のユーザーがセッション期限切れのページにプッシュアウトし、次のような情報を表示する必要があります。詳細については、次を参照してください: SomeLinkHere"

注:ユーザーが別のブラウザまたはマシンからログインしたときに、ユーザーのログインセッションを無効にしたくないだけです。ユーザーがリンクをクリックしたり、さらに認証されたページを要求したりしていなくても、ユーザーをセッション期限切れのページにプッシュしたい.

この背後にある主な意図:たとえば、「ユーザーがライブ レポート (つまり、socket.ioのダッシュボード) などの機密データを見ていて、自分のパスワードを他のユーザーと共有している場合」のような状況を回避するため。

質問: socket.io はリアルタイム データのレポートに既に使用されているため、既存の socket.io 接続を過負荷にせずにこれを達成するにはどうすればよいですか?

4

1 に答える 1

5

これは、を使用して行うことができます。

  1. アプリ内のユーザーが認証されると、クライアントは接続を行いますが、接続関数呼び出しでユーザー ID (またはその他の一意の識別子) も渡します。お気に入り:

    socket.on('connect', function(){
      socket.emit('adduser', userID);
    });
    
  2. サーバーで、ユーザー ID 情報に関連付けられたソケットを保持するための JSON 配列を保持します。お気に入り:

    [{'USERID1':'SOCKETID1'},{'USERID2':'SOCKETID2'}....,{'USERIDN':'SOCKETIDN'}]
    
  3. 新しいユーザーがソケット接続を行うと、ユーザー ID が配列内に既に存在することを確認します。お気に入り

    socket.on('adduser', checking function here);
    
  4. すでに存在する場合は、既存のものを強制的に切断し、JSON 配列の socketid を新しいもので更新します。

    ここに参照があります

于 2013-03-05T09:59:41.357 に答える