8

アプリケーションで、長いポーリングを使用して JavaScript チャットを実装しました。許可されているドメインごとに 1 つの Ajax リクエストしかないため、ポーリング リクエストをサブドメインに移動したいと考えました。

だから私は2つのドメインを持っています:

dev.site.com
poll.dev.site.com

config.ymlは次のように入力しました:

framework:
    session:
        domain: .dev.site.com
        cookie_domain: .dev.site.com

しかし、Ajax 経由でサブドメインをポーリングしようとすると、Symfony はログイン状態を維持しません。

サブドメインでセッションを維持する方法について何か考えはありますか? FOSUserBundle を使用しています

4

1 に答える 1

2

まず、2 つのアプリケーションがfos_userテーブルを共有して、いつでもユーザーをリロードできるようにする必要があります。「1 つのアプリと、同じアプリを指す 2 つのドメイン」があるためです。これはすでに正しいはずです。

次に、ドメインとサブドメイン間で共有されるセッション Cookie を設定します。あなたの質問の設定は正しいです。ただし、dev.site.com から poll.dev.site.com に変更したときに FOSUserBundle がユーザーをリロードできるようにするには、2 つのドメイン間でセッション ストレージを共有する必要があります。

私が提案できる最も簡単な方法は、セッションをデータベースに保存することです。これは、Symfony で利用可能なPdoSessionStorageを使用して実現されます。公式ドキュメントには、それを行うためのセッション ストレージのセットアップ方法が記載されています。

上記のすべてが正しく行われた場合、dev.site.com の安全な領域にログインできず、再度ログイン資格情報を提供することなく、URL を poll.dev.site.com の別の安全な領域に変更できます。ユーザー資格情報は安全な領域にのみ読み込まれることに注意してください。

poll.dev.site.com をブラウザーで直接開くことができる場合は、資格情報を再度入力する必要があります。Ajax リクエストを機能させるには、追加の作業を行う必要があります。

次の 2 つの質問: Setting a cookie on a subdomain from an ajax requestマルチサブドメイン cookie、および ajax の問題によると、問題はおそらくhttp://en.wikipedia.org/wiki/Same_origin_policyです。

1 つ目は、dev.site.com で次のヘッダー フィールドを設定することを提案しています。

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://poll.dev.site.com

そして、ajax リクエストでwithCredentialsを渡します。

$.ajax({
    url: 'http://poll.dev.site.com/some/ajax/endpoint.json',
    xhrFields: { 
        withCredentials: true 
    }
});

Cookieを設定してajaxリクエストを試行するだけのダミーファイルを使用してテストしました。ajax リクエストにwithCredentialsがあれば動作するようになりましたが、Access-Control-Allow-* ヘッダーの有無にかかわらず試してみると、違いはわかりませんでした。

他の回答は document.domain の使用を提案しましたが、私はそれをテストしません。

テスト時に Cookie ヘッダーがサーバーに送信された場合、Opera の Dragonfly を使用してネットワーク トラフィックを検査しました。Firebug、Chrome、またはおそらく IE も使用できます。

于 2013-03-24T17:03:43.673 に答える