web-dev-qa-db-ja.com

エクスプレス/接続とセッションストアを使用しているときにセッションIDを見つけるにはどうすればよいですか?

ユーザーが既にログインしていて、新しいインスタンスで再度ログインしようとする場合、他のユーザーインスタンスからログアウトしたいと思います。同じユーザーがアプリケーションに2回ログインするのは望ましくありません。

現在、セッションはRedisストアに保存されており、セッションストレージを処理するためにexpress/connectを使用しています。セッションを破棄するために使用できる機能の1つは次のとおりです。

.destroy(sid, callback)

ただし、.destroy()を呼び出す前に、そのセッションIDを見つける必要があります。 Redisでは、ユーザー名はセッションの一部として保存されます。

質問:Redisに問い合わせて、ユーザー名に基づいてセッションIDを取得することは可能ですか?

25
Jack

req.sessionIDは、セッションのIDを提供します。reqはリクエストオブジェクトです。

71
Joe H

最近の読者向け。

Connectミドルウェアは、バージョン4以降のExpressには含まれていません。

したがって、req.sessionIDを機能させるには、以下を実行する必要があります。

  1. Package.json内にcookie-parser abd express-sessionモジュールがあることを確認してください。追加されていない場合は追加します:
npm install express-session --save
npm install cookie-parser --save
  1. app.jsファイルでそれらを要求する際には順序に注意し、必要な構成パラメーターを追加してください。
var cookieParser = require('cookie-parser');
var session = require('express-session')
app.use(cookieParser());
app.use(session({
    secret: '34SDgsdgspxxxxxxxdfsG', // just a long random string
    resave: false,
    saveUninitialized: true
}));
  1. これで req.sessionIDreq.session.id を使用する必要があります。
19
scaryguy

ユーザーアカウントのデータベース検証中にユーザーがログインしたときに、ユーザーが.destroy(sid、fn)を呼び出したときにSIDをアカウントに保存し、ユーザーの現在のSIDでデータベースのSIDを更新します。

MongoDBを使用する私の場合、これは私がそれをやった方法です:

app.post('/login', function(req, res)
{
  var sid = req.sessionID;
  var username = req.body.user;
  var password = req.body.pass;

  users.findOne({username : username, password : password}, function(err, result)
  { 
    ...
    sessionStore.destroy(result.session, function(){
       ...
       users.update({_id: result._id}, {$set:{"session" : sid}});
       ...
    }
    ...
  }
}
15
Jack

質問:ユーザー名に基づいてセッションIDを取得するためにRedisを照会することは可能ですか?

いいえ。redisのセッションキーは、ユーザー名にちなんで命名されていません。

ただし、すでにログインしているユーザーが再度ログインしようとすると、アプリケーションでそれを確認して、古いセッションをすぐに破棄するか、再度ログインできないようにすることはできませんか?