SSO と埋め込み

Discourse インスタンスを SSO(SAML/Shibboleth 使用)で設定しており、同じ SSO を利用する別のサブドメインへのコンテンツ埋め込みを許可するように構成しました。

ここで発生している問題です:

  1. ユーザーがサブドメイン X のページを訪れ、そこにはサブドメイン Y でホストされている Discourse のトピックが埋め込まれています。
  2. ユーザーは SSO ログインのためにサブドメイン Z にリダイレクトされ、その後サブドメイン X に戻されます。
  3. サブドメイン X のページが JavaScript 埋め込みファイルを読み込み、フォーラムトピックを取得しようとする iframe を作成します。しかし、Discourse(サブドメイン Y)は iframe を SSO 用のサブドメイン Z にリダイレクトします。ユーザーは既にログインしているため、Discourse の埋め込み URL へ再度リダイレクトされます。ただし、これにより「Error Embedding」の 400 エラーが発生します。これは、リファラー URL が許可/ホワイトリストに登録されているサブドメイン X ではなく、SSO サブドメイン Z から来ているためです。Discourse は「The referer was either not sent, or did not match any of the following hosts」というメッセージを返します。
  4. ページをリフレッシュすると、すべて正常に動作します(つまり、フォーラムトピックが正常に読み込まれます)。おそらく、ブラウザに有効なセッションクッキーが存在するため、SSO サブドメインへのリダイレクトが不要になるためでしょう。

これを適切に修正する方法はありますか?現在、非常に厄介なハックを設定しています。まず、フォーラムトピックを非表示の iframe に読み込もうとし、1 秒待ってからユーザーに見える実際のページにトピックをロードするというものです。

ご助言やご提案をいただければ幸いです!

さらに詳しく調べてみたところ、@simon がこの投稿で説明しているアプローチを少し修正した、よりハック的な手法ではない解決策があるのではないかと思いました:Automatically login via SSO - #4 by simon

  1. 「SSO がすべての戻りパスを許可する」設定を有効にする
  2. 自分のページに隠し iframe を追加し、https://discourse.example.com/session/sso?return_path=path_to_mypage.html を読み込む
  3. ユーザーがログインしている場合(親ページで既に SSO 経由でアプリにログインしているため、ユーザーの操作は不要)、iframe が mypage.html にリダイレクトされた時点で、postMessage() を使用して親ページに「ユーザーが Discourse にログインした」ことを伝え、フォーラムトピックを埋め込むスクリプトをトリガーする

それでもまだ理想的な解決策には思えません。なぜなら、追加の往復通信が発生するからです(上記のプロセスは、ユーザーがまだ Discourse にログインしていない場合にのみ必要です)。

私には、埋め込みページの参照元 URL を SSO 経由でリダイレクトされる際に保持できるようにすることが、理想的な解決策のように思えます。

編集:上記で説明した改良版の「ハック」を実装しました。少なくとも、OP で説明した元のハックよりもはるかにうまく機能していると言えます。