2016-08-22 8 views
0

example.com、auth.example.com、およびapi.example.comの3つのサブドメインを持つプラットフォームを構築するのに忙しいです。それらは3つの別々のNodeJSアプリがサーバーの異なるポートで実行されて実行されます。ここでノードアプリケーション間でRedisセッションを共有する

がセッションを設定するコードです:

var session = require("express-session"); 
var redisStore = require("connect-redis")(session); 
var redisClient = require("redis").createClient(config.redis); 

app.use(session({ 
     secret: config.server.secret, 
     store: new redisStore(config.redis), 
     client: redisClient, 
     resave: false, 
     saveUninitialized: false, 
     cookie: { 
      domain: "example.co.za", 
      httpOnly: false 
     } 
})); 

構成は正確にすべての3つのアプリケーションで同じであり、それらは同じサーバー上に座っています。何らかの理由で、セッションが共有されていません。私は彼らが数週間前に共有されていたことを覚えているようですが、今は物事が壊れています - 私はすべてのトラフィックをHTTPからHTTPSに移動したときにこれが起こったという不機嫌な疑惑を抱いています。これはセッションを壊すだろうか?私はセッションを制限した場合には 'httpOnly'を回そうとしましたが、運はありませんでした。

私はredid-cli MONITORを実行していますが、セッションは実際にはログイン(認証アプリケーション)に保存されていますが、他のアプリでは取得されていません。 saveUninitializedをtrueにすると、保存リクエストは3つのアプリケーションすべてから行われていました。これは、同じRedis Storeに接続されていることを示しています。

助けがあれば助かります。

+0

を発行した場合には

cookie: { domain: ".example.co.za", httpOnly: false } 

。また、ヘッダー(特に 'Set-Cookie')をチェックし、[this]を見てください(http://stackoverflow.com/questions/7834228/set-cookie-for-domain-instead-of-subdomain-using- nodejs-and-expressjs)。これはコメントのための質問には大きすぎるかもしれませんが、あなたの認証とエンドポイントにセッションが必要な理由はありますか? – dvlsg

+0

以下の答えが私の問題を解決しました。しかし、助けてくれてありがとう。すべての好奇心を満たすために、authはログイン後にセッションを作成していましたが、アクセスを許可する前にセッションがアクティブであることを確認して内部のデータを確認する必要がありました。 – nickcorin

答えて

0

これは単なるクッキーの問題だと思います。ブラウザはあなたのサブドメインにセッションクッキーを送り返していません。 あなたは先頭が必要です。ドメイン上で例えば:動作しません、あなたはAJAXはどんな違いがあるかどうかを確認、クッキーは、各クライアントから送信された/保存されているかを確認しsee this post

+0

ありがとう!何らかの理由で私はこれを試しましたが、最初はうまくいきませんでした。後でもう一度試してみると、ちょうどうまくいったのですか?いずれにせよ、私にもう一度それを試してくれてありがとう:) 私は 'httpOnly:false'を設定する必要はありませんでした.HTTPSでは' true'としてうまくいきました。 – nickcorin

関連する問題