私のアプローチでは、1つのドメインを「中央」ドメインとして指定し、他のドメインを「衛星」ドメインとして指定します。
誰かが「サインイン」リンクをクリックすると(または永続的なログインCookieを提示すると)、サインインフォームは最終的に、中央ドメインにあるURLに、データがどのドメインから来たかを示す非表示のフォーム要素とともにデータを送信します(便宜上、ユーザーは後でリダイレクトされます)。
次に、中央ドメインのこのページは、セッションCookieの設定に進み(ログインがうまくいった場合)、そのセッションに固有のURLに特別に生成されたトークンを使用して、ユーザーがログインしたドメインにリダイレクトします。
次に、サテライトURLのページは、そのトークンをチェックして、セッション用に生成されたトークンに対応しているかどうかを確認します。対応している場合は、トークンなしで自分自身にリダイレクトし、ローカルCookieを設定します。これで、サテライトドメインにもセッションCookieがあります。このリダイレクトにより、URLからトークンがクリアされるため、ユーザーまたはクローラーがそのトークンを含むURLを記録する可能性は低くなります(記録した場合でも、トークンは使い捨てトークンである可能性があります)。
これで、ユーザーは中央ドメインとサテライトドメインの両方でセッションCookieを使用できます。しかし、彼らが別の衛星を訪問した場合はどうなるでしょうか。さて、通常、それらは認証されていないように衛星に見えます。
ただし、私のアプリケーション全体で、ユーザーが有効なセッションに参加しているときはいつでも、他のサテライトドメインのページへのすべてのリンクに?sまたは&sが追加されます。この「s」クエリ文字列は、「このユーザーにはセッションがあると見なされるため、中央サーバーに確認する」ことを意味するように予約しています。つまり、どのHTMLページにもトークンまたはセッションIDは表示されず、誰かを識別できない文字「s」のみが表示されます。
このような「s」クエリタグを受信するURLは、有効なセッションがまだない場合、「これが誰であるかを教えてくれませんか」と言って中央ドメインにリダイレクトします。クエリ文字列に何かを入れることによって。
ユーザーが中央サーバーに到着したときに、そこで認証されている場合、中央サーバーは単にセッションCookieを受信します。次に、ユーザーを別の使い捨てトークンとともに衛星に送り返します。これは、衛星がログイン後と同じように処理します(上記を参照)。つまり、サテライトはそのドメインにセッションCookieを設定し、それ自体にリダイレクトしてクエリ文字列からトークンを削除します。
私のソリューションは、スクリプトやiframeのサポートなしで機能します。ユーザーがまだそのURLにCookieを持っていない可能性があるクロスドメインURLに「?s」を追加する必要があります。私はこれを回避する方法を考えました。ユーザーが最初にログインするときに、すべての単一ドメインの周りにリダイレクトのチェーンを設定し、各ドメインにセッションCookieを設定します。私がこれを実装していない唯一の理由は、これらのリダイレクトが発生する順序と停止するタイミングを設定できる必要があり、15ドメイン程度を超えて拡張できないという点で複雑になるためです。 (多すぎると、多くのブラウザやプロキシの「リダイレクト制限」に危険なほど近づきます)。
フォローアップメモ:これは11年前、ウェブが大きく異なっていたときに書かれました。たとえば、XMLhttprequestは、ドメイン間で信頼できるものとは見なされていませんでした。