9

現在、2つの異なるポートで2つの別々のノードアプリを実行していますが、同じバックエンドデータストアを共有しています。2つのアプリ間でユーザーセッションを共有して、ユーザーが1つのアプリからログインしたときにセッションが利用可能になり、他のアプリにログインしているように見えるようにする必要があります。この場合、それは公開されているWebサイトと管理バックエンドです。

セットアップは次のとおりです。

  • Expressのノード
  • パスポートは、ローカル戦略で認証を処理するために使用されています
  • connect-redisを使用して、redisを介してセッションを共有できるようにしています。
  • 私たちのドメインは次のようになります:www.mydomain.comとadm.mydomain.com

セッションスタッフ(およびredis)の構成は、両方のアプリで同じです。

session: {
    options: {
        secret: "my secret",
        cookie: {
            domain: "mydomain.com",
            maxAge:1000*60*60*24
        }
    },
    redis: {
        host: 'my host',
        maxAge: 86400000,
        secret: "my secret"
    }
}

app.jsのセッションのものの設定は次のようになります。

if ( app.settings.env === "production" ) {
    session.options.store = new RedisStore(session.redis);
}
app.use(express.session(session.options));
app.use(passport.initialize());
app.use(passport.session({ secret: 'a different secret' }));

私が期待すること:2つのアプリ間のCookieに同じセッションIDが表示されるようにします。

だから私の質問は:異なるサブドメイン間でセッションを共有できるように、エクスプレス、redis、パスポートを設定するにはどうすればよいですか?

4

2 に答える 2

4

少し時代遅れかもしれませんが、現時点では、Express-sessionはCookieのドメインオプションを認識できます。ソースによると:

function session(options){
  var options = options || {}
  //  name - previously "options.key"
    , name = options.name || options.key || 'connect.sid'
    , store = options.store || new MemoryStore
    , cookie = options.cookie || {}
      ...

そしてこれはクッキーを設定するためのものです:

var Cookie = module.exports = function Cookie(options) {
  this.path = '/';
  this.maxAge = null;
  this.httpOnly = true;
  if (options) merge(this, options);
  ...

したがって、このようなものは現在の1.10.1マスターで機能します。

secret: "my secret",
    cookie: {
        domain: "mydomain.com",
于 2015-01-12T23:20:47.140 に答える
2

Express-sessionはCookieの「ドメイン」オプションを認識していないようであるため、問題が発生します。セッションIDを保存するCookieは、各アプリのドメインに自動的に関連付けられるため、共有できません。

1つのオプションは、独自のシングルサインオンモジュールを作成して、Webアプリケーション間でセッションを共有することです。おそらく、実行順序のかなり早い段階でapp.use()宣言に存在し、別のCookie(クロスドメイン)を作成し、別のSSOセッションIDを作成し、この新しいCookieにSSOIDを保存するだけです。 。その後、必要に応じてreq.sessionとreq.sso-sessionをクロスポピュレートするだけです。

于 2014-10-24T20:38:48.677 に答える