web-dev-qa-db-ja.com

クロスドメインCookie

小さな問題があります。

複数のドメインにCookieを設定するにはどうすればよいですか?

私はセキュリティの問題を理解していますし、それは以前に行われたと確信しています。この理由はSSOです。

すなわち。

account.domain.comはログインするドメインを設定する必要があります:

domain.com、domain1.com、domain2.com。

PHPとcookie、または他の代替手段を使用して、簡単な方法はありますか?

25
bear

Domain.comがdomain1.comのCookieを設定する方法はまったくありません。あなたがやろうとしていることは、ユーザーのブラウザに各ドメインにリクエストを送信させ、それが独自のクッキーを設定することによってのみ解決できます。

次に、各ドメインがユーザーのIDを確認する方法が必要です。これには2つの方法があります。

  1. バックチャネル-ユーザーがログインしているかどうかを判断するために、サイトは互いに直接連絡します。
  2. GETまたはPOST=でトークンを渡す-ユーザーのブラウザーが他のサイトにリダイレクトされると、IDとセッションステータスを含むデジタル署名されたパラメーターが渡されます。

それは本当にかなり複雑です。自分でロールバックしないことをお勧めします。私が説明しているもののPHP実装については SimpleSAMLPHP を見てください。

31
Andrew Strong

これは、マスターのように動作するドメインとスレーブのように動作するドメインを介して実行できます。

ドメインaccounts.domain.comがあり、それがマスターだとします。

次に、スレーブdomain.comsomething.com、およびanother.comがあります。

Domain.comにログオンすると、実際にはサイトaccounts.domain.comになり、ブラウザに一意のIDが設定されたCookieが取得され、domain.comのログオン後のページにリダイレクトされますランディングページ(つまり、domain.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>)。ランディングページはaccounts.domain.comにアクセスし、ブラウザIDでクエリします。トランザクションに問題がなければ、domain.comからログオンCookieを取得します。

次に、すべてのドメイン(domain.comsomething.comanother.com)がaccounts.domain.com/roaming-check?return-url=<URL the redirect was initiated from>に最初にリダイレクトされます。私たちは家に戻るため(すでにaccounts.domain.comにログオンしています)、ランディングページ(<domain name>.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>)に再度リダイレクトされ、ここからはログオンした部分と同じになります。私たちはシームレスに別のドメインにローミングします(ブラウザーは通常、ヘッダーのsend(server)/ receive(browser)セクションを通過するまでリダイレクトされたページを表示しないため、ユーザーには知らされません)。

実際にアクティブなログオンがない場合、サイトはこの「ネガティブログオン」をセッションに保存し、ログオンの確認を試みません(ログオンまたは別のドメインのロードを試みるまで)。

6
lmojzis

あなたがしようとしていることはできません。 (これはブラウザのセキュリティ問題であり、PHP 1つではありません。)

何らかのオフサイト認証を使用する以外に、最も近い方法は、サブドメイン間でCookieにアクセスできるようにすることです。この場合、PHPの set_cookie 関数のオプションの「ドメイン」引数を使用するだけです。

6
John Parker

このソリューションはあなたのニーズに合うと思います: " PHPのシンプルなシングルサインオン "

4
merkuro