皆さん、こんにちは。
アプリケーション内のiframeにDiscourseインスタンスを埋め込んでおり、そのように動作しています。しかし、認証されていないユーザーがアクセス権のないページ(存在しないか、グループ制限されている)にアクセスしようとすると、応答にX-Frame-Options: SAMEORIGINが奇妙に含まれ、ブラウザはフレームのレンダリングをブロックします。
3.3.1安定版からほぼ最新の最先端(最後にテストしたのは先週半ば)までのさまざまなバージョンで確認しました。
これは親アプリとは異なるサブドメインで実行されており、allow_embedding_site_in_an_iframe: trueで埋め込み用に設定されています。クリーンなインスタンスをデバッグしたところ、このような場合、ApplicationControllerのconditionally_allow_site_embeddingメソッドが呼び出されず、ヘッダーが応答に残ってしまうことに気づきました(GHリンク)。そして、どこかで例外が発生してフローが中断していることを追跡しました。
再現手順:
- Discourseのクリーンインスタンス(または実際には任意のインスタンス)を実行し、
allow_embedding_site_in_an_iframe: trueで設定します。 - HTTPSで提供されるウェブサイトのiframeに埋め込み、存在しないパスを使用して404エラーをトリガーします。
期待される動作: ブラウザはDiscourseのレンダリングを許可します。
実際の動作: ブラウザは、応答に含まれるX-Frame-Options: SAMEORIGINにより、Discourseのレンダリングを防止します。
補足:DNSのみのCloudflareを経由して実行しており、プロキシモードでヘッダーを削除しようとしましたが、カスタムSSO実装に必要なCookieをCFがフィルタリングするため、プロキシモードにすることはできません。そのため、現時点では選択肢がありません。