0

Socket.ioandを使っExpressてチャットアプリを作っています。

チャットは匿名で、データベースには何も保存したくありません。ユーザーの IP アドレスを確認して、同じ IP アドレスからの別のログインを防止することも考えられますが、人々は共有 IP アドレスでオンラインになっているため、それは良い考えではありません。もう1つはセッションIDですが、ユーザーがブラウザの別のタブからログインした場合でも変化します。データベースを使用せずにこれを行う簡単な方法はありますか? できれば他のパッケージ/ライブラリをインストールせずに?

4

2 に答える 2

2

Express.session ミドルウェアは Cookie ベースのセッションを使用します。デフォルトでは、セッションはメモリにのみ保存され、データベースには保存されません。ユーザーが新しいタブを開いた場合、Cookie ベースのセッションは変更されません。この記事は SO の別の場所で言及されており、socket.io で高速セッションを使用するための良いリファレンスとして言及されています。一般に、socket.io ( sio.set('authorization', authCallback)) で承認するときにセッションを確認するだけで済みますが、アプリはユーザーを適切な部屋に接続するように機能します。

更新:(Cookieを使用してユーザーをブロックする方法についてより具体的に)

// Var to save if the user is connected or not
var connectedUsers = [];

sio.authorization(function(data, next){
  var cookie = data.headers.cookie && data.headers.cookie.match(/auth=([^;]+)/);
  cookie = cookie && cookie[1] || null;

  if (cookie && connectedUsers.indexOf(cookie)){
    next(null, false);
  }
  else {
    connectedUsers.push(cookie);
    next(null, cookie);
  }
});

// Somewhere else
socket.on('disconnect', function (data) {
  var cookie = data.headers.cookie && data.headers.cookie.match(/auth=([^;]+)/);
  cookie = cookie && cookie[1] || null;

  if(cookie) {
    connectedUsers.splice(connectedUsers.indexOf(cookie), 1);
  }
});

これは、Cookie の値を取得するための非常に基本的な方法ですが、私にとってはうまくいきました。この解決策を試す時間がありませんでしたが、原則は機能するはずです。

于 2013-03-10T21:29:52.640 に答える
2

これが私がしたことであり、私のために働いたものです。アンドレアスの答えと大差ありません:

var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
app.configure(function() {
    //app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({ 
            store: sessionStore, 
            secret: 'someSecret',
            key: 'cookie.sid', maxAge: null }));
            });

var sessionID;
var sessionArray = new Array();
var sessionIDs = new Array();

私の「ログイン」機能には次のものがあります。

sessionArray = socket.handshake.headers.cookie.split(" ");
sessionID = sessionArray[0].split("express.sid=").pop();

if(sessionIDs.indexOf(sessionID) > -1) {
   io.sockets.socket(socket.id).emit('preventlogin', true);
}
else {
   sessionIDs.push(sessionID);
   // and do the rest
}

そして「切断」で私はします:

var ind = sessionIDs.indexOf(sessionID);
sessionIDs.splice(ind, 1);
于 2013-03-12T22:58:20.557 に答える