2012-04-09 16 views
1

からクッキーを設定すると、ページが問題である: http://www.customazon.com/demoここで異なるドメイン-SRCはiframe

主要ページ(@ customazon.com)が二次ドメイン(@ gamekeg.com)を含むインラインフレームをロードします。パスワードを入力してAdmin Control Panelにログインできるようにします。問題は、2番目のドメインであるため、ブラウザはそれを「第三者のCookie」として扱い、ほとんどがそれらを完全に拒否することです。このiframe内にCookieを設定する方法を見つける必要があります。 Cookieの設定を調整するようユーザーに指示するには、ではなく、のオプションがあります。

観光私が試してみた: ヘッダ( 'P3P:CP = "IDC DSP COR ADM

  1. ヘッダにおけるP3P短いバージョン(CP =ストリングの多くの異なるバージョン)の設定します私たちのCNTのコンビネーションには、PSA PSD IVAiがあります。

  2. policy.p3pとp3p.xmlファイルを使用してP3Pロングバージョンを作成しています(おそらく間違っていますが、私は管理できました)。

  3. いくつかの奇妙なjavascriptが非表示のiframeを読み込んで投稿しています(Safariの回避策ですか?)。

ごくわずかしか機能していません。これを可能にする方法を見つけるために与えられるどんな助けも素晴らしいでしょう。

答えて

3

(私は、ドメインがこの回答に入れ替え得ているかもしれないが、理論は同じでなければなりません。)

あなたの最善の策は、customazon.comにgamekeg.comログインページからcross-domain AJAX requestを行うことであろう(クロスドメインリクエストを許可するには、いくつかの特別なヘッダーを送信する必要があります - 詳細はそのリンクを参照してください)。通常の状況下では、両方のサイトを管理しない限り(これは思われる)、これは不可能です。その後

// Send appropriate cross-domain headers here. 
// In addition, you must configure your crossdomain.xml in your root. 
header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
header("Access-Control-Allow-Credentials: true"); 
header("Access-Control-Allow-Origin: http://source.com"); 
header("Access-Control-Allow-Headers: Content-Type, *"); 
if (isset($_POST["username"]) && isset($_POST["password_hash"])) { 
    setcookie("username", $_POST["username"], time() + 24 * 60 * 60); 
    setcookie("password", $_POST["password_hash"], time() + 24 * 60 * 60); 
} 

、:

// I don't expect you to use jQuery, but I don't recall the entire 
// AJAX process off of the top of my head. You may have to set 
// xhr.withCredentials = true or something. 
$.ajax(
    "http://customazon.com/ajax_login.php", 
    { 
     "username": <?php echo $username; ?>, 
     "password_hash": <?php echo $password_hash; ?> 
    } 
); 

ajax_login.phpのようなものかもしれません:ユーザが正常にログインした後、あなたがこのような呼び出しを行うことができますgamekeg.comのログインページで

、フレームコンテナ上で頻繁にチェックを行い、ユーザがログインしているかどうかを確認することができます(:QuirksMode)。

function readCookie(name) { 
    var nameEQ = name + "="; 
    var ca = document.cookie.split(';'); 
    for(var i=0;i < ca.length;i++) { 
      var c = ca[i]; 
      while (c.charAt(0)==' ') c = c.substring(1,c.length); 
      if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 
    } 
    return null; 
} 

function checkAjaxLogin() { 
    if (readCookie("username") !== null && readCookie("password")) { 
     // You're logged in now; refreshing the page should 
     // do the rest, assuming the cookies are named correctly. 
     window.location.refresh(); 
    } 
} 

ただし、Flashを使用できる場合は、Flash要求がドメイン間ポリシーを気にしないため、処理が迅速化される可能性があります。しかし、私は例を提供するためのFlashのスキルはありませんし、とにかく多分、おそらくあります。

+1

checkAjaxLoginを除いて、あなたが提案したものを適用しました。なぜなら、それが何をしているのか、なぜ必要なのかがはっきりしていないからです。 Ajaxは正しくポスティングされているようです。 ajax_loginがその役割を果たしているようです。 crossdomain.xmlはそこにあります。しかし、私はまだクッキーが設定されて表示されません。 –

+0

今ログインしようとすると、画面上部にvar_dump($ _ COOKIE)(gamekeg.comから)が表示されます。ログインすると、customazonで動作するajaxからの応答のアラート()が表示されます。データが受信され、setcookieが呼び出されたことを示し、$ _COOKIE(customazon.comから)も出力します。両方のcookie var_dumpsは空の配列を表示します。私は今何が逃していますか? –

+0

私は実際にフレームを見ていません。彼らはどこにいるのですか? –

関連する問題