1

Appfog で Yii アプリを実行しています。複数のインスタンスを使用しようとすると、サインインしたままにすることができなくなります。

複数のインスタンスにはセッション用の共有ストレージが必要であることを知っており、EDMSHttpSession を使用してそれを実装しました。つまり、サインインしてApacheを再起動し、サインインしたままにすることができます。また、データベースのセッションレコードを削除すると、サインアウトします。これは、PHP がセッションを保存するためにデータベースを使用していると結論付けます。

セッション用の共有ストレージが Appfog で機能しない理由がわかりません。これをデバッグする方法について提案をお願いします。

その他の背景情報:

  • 自動ログインにはクッキーを使用しています。それらは30日間有効である必要があります(Chromeインスペクターによると)が、数時間以上機能することはありません(ブラウザーセッションだと思います)-localhostでもAppfogでもありません。
  • 複数のインスタンスと自動ログインを有効にすると (つまり、「remember me」をクリックします)、通常は 2 ~ 3 回のページ更新後にランダムに追い出されます。私が理解しているように、Cookie はサーバー セッションに関係なく自動的にサインインする必要がありますか?
  • Appfog には SSL エンドポイントがありますが、localhost にはありません。
  • Appfog の共有セッション ストレージが新しいセッションを取得していることを確認しました (データベース テーブルを調べます)。

アップデート:

私はいくつかのテストを行いましたが、おそらく私の結果は誰かにとって意味のあるものになるでしょう。

すべての Cookie を消去し、Appfog アプリを再起動します。サインインして、「Remember me」にチェックを入れます。現在、次の応答 Set-cookie ヘッダーは次のとおりです。

Set-Cookie:PHPSESSID=vrfoi0o15v3qps2644uqtvkfa1; path=/  
Set-Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; path=/  
Set-Cookie:73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D; expires=Sun, 09-Jun-2013 08:32:24 GMT; path=/

後続のリクエストでは、リクエスト Cookie ヘッダーは次のとおりです。

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D

"db38s1k1vp5ngll837ac0vh0u7"データベースで自分のセッションを見つけるために使用します。その行は次のようになります (vrfoi0o15v3qps2644uqtvkfa1データベースには見つからないことに注意してください)。

{
  "_id" : ObjectId("518cb0981045979e06000000"),
  "data" : "73dfaf673b71b1f92d34b8ab63dab17b__id|s:24:\"5087ea0b3145a75545000000\";73dfaf673b71b1f92d34b8ab63dab17b__name|s:22:\"demo@playbackenergy.se\";73dfaf673b71b1f92d34b8ab63dab17b__states|a:0:{}73dfaf673b71b1f92d34b8ab63dab17brole|s:4:\"demo\";",
  "expire" : 1368176186,
  "id" : "db38s1k1vp5ngll837ac0vh0u7"
}

Appfog アプリを再起動して、アプリ内の別のページに移動しようとすると、サインアウトされます。

ログインページへのリダイレクト前のリクエスト Cookie ヘッダーは (以前と同じ):

Cookie:PHPSESSID=db38s1k1vp5ngll837ac0vh0u7; 73dfaf673b71b1f92d34b8ab63dab17b=812bbcfd4f5b3be91f8c85d39c3b37bb93e4c6b8a%3A4%3A%7Bi%3A0%3Bs%3A24%3A%225087ea0b3145a75545000000%22%3Bi%3A1%3Bs%3A22%3A%22demo%40playbackenergy.se%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A0%3A%7B%7D%7D
4

2 に答える 2

1

デバッグ方法についての提案のみを求めたので、次のようにします。

  • 各インスタンス レイアウト ファイルにさまざまな隠し文字列を追加して、現在のリクエストを処理したインスタンスを確認できるようにします。
  • ブラウザのリクエスト/レスポンス ヘッダーの Cookie を調べて、すべてのリクエストで同じセッション ID が送信されるかどうか、およびサーバーから新しいセッション ID がいつ返されるかを調べます。

これは、セッションが失われた状況を特定するのに役立ちます。

アップデート

  • セッションが本当に破棄されたのか、それとも Yii がログアウトしただけなのかを調べてください。これを行うには、ゲスト ユーザーとしてセッションに何かを書き込み、リロード時にこの情報が失われるかどうかを試します。
  • 無効allowAutoLoginにして、今すぐ機能するかどうかを確認します。
于 2013-05-10T07:29:29.507 に答える
0

最後に、Michael Härtl の提案のおかげで、この問題のデバッグに成功しました。

2つのことを修正する必要がありました

1) protected/config/main.php でアプリケーション ID を指定します。

array(
    'name' => 'My App',
    'id' => 'yourdomain',
    ...,
)

これを行わないと、複数のインスタンスが異なる ID を持つことになります。Yii はセッション変数の前に app-id のハッシュを使用するため、セッション ストレージを共有していても、異なるインスタンス間で共有できます。この Yii 記事では、より詳細に説明しています: http://www.yiiframework.com/wiki/135/single-sign-on-across-multiple-subdomains/

2) アセットの CDN と共有チャッシングを使用します。どうやらアセット フォルダー (例: 3f4ad45) はこのインスタンス間で異なる可能性があるため、共有ストレージを使用する必要があります。アセットの管理には拡張機能http://www.yiiframework.com/extension/s3assetmanager/を使用し、キャッシュ (MemCachier) にはhttps://github.com/aarondfrancis/yii-CMemCacheSASLを使用しました。

于 2013-05-26T12:05:26.853 に答える