1

問題のページは次のとおりです: http://www.customazon.com/demo

プライマリ ページ (@customazon.com) は、セカンダリ ドメイン (@gamekeg.com) を含む iframe を読み込みます。提供されたパスワードを使用してユーザーが管理者コントロール パネルにログインできるようにしたいと考えています。問題は、それが 2 番目のドメインであるため、ブラウザがそれを「サード パーティの Cookie」として扱い、ほとんどがそれらを完全に拒否することです。この iframe 内で Cookie を設定できるようにする方法を見つける必要があります。ユーザーに Cookie の設定を調整するよう依頼することはできません

私が試したこと:

  1. ヘッダーに P3P ショート バージョン (CP= 文字列のさまざまなバージョン) を設定します。

  2. policy.p3p および p3p.xml ファイルを使用して P3P ロング バージョンを作成します (おそらく間違っていますが、できる限りのことを行いました)。

  3. 非表示の iframe を読み込んで投稿する奇妙な JavaScript (Safari の回避策?)。

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

4

1 に答える 1

3

(この回答でドメインを切り替えた可能性がありますが、理論は同じはずです。)

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

gamekeg.com のログイン ページで、ユーザーが正常にログインした後、次のように呼び出しを行うことができます。

// 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次のようなものかもしれません:

// 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);
}

次に、フレーム コンテナーで、ユーザーがログインしているかどうかを頻繁に確認できます ( QuirksModereadCookieから取得)。

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 のスキルは私にはありません。

于 2012-04-09T06:43:48.513 に答える