Всем привет,
У нас есть экземпляр Discourse, встроенный в iframe внутри нашего приложения, и в таком виде он работает нормально. Однако, когда неаутентифицированный пользователь пытается получить доступ к странице, к которой у него нет прав (либо страница не существует, либо она ограничена для определённой группы), в ответе теперь загадочным образом появляется заголовок X-Frame-Options: SAMEORIGIN, и браузеры блокируют отображение фрейма.
Я проверил разные версии, начиная с 3.3.1 stable и заканчивая почти текущей bleeding edge (последний тест проводился в середине прошлой недели).
Экземпляр работает на другом поддомене, чем родительское приложение, и настроен для встраивания с помощью параметра allow_embedding_site_in_an_iframe: true. При отладке чистого экземпляра я заметил, что в таком случае метод conditionally_allow_site_embedding в ApplicationController не вызывается, из-за чего заголовок остаётся в ответе (ссылка на GH). Причиной этого, как я выяснил, является выбрасывание исключения на каком-то этапе, что прерывает выполнение потока.
Воспроизведение:
- Запустите чистый экземпляр Discourse (или любой другой — это произошло в локальной, тестовой и продакшн-средах) и настройте его с параметром
allow_embedding_site_in_an_iframe: true. - Встройте его в iframe на веб-сайте, обслуживаемом через HTTPS, используя несуществующий путь, чтобы спровоцировать ошибку 404.
Ожидаемое поведение: Браузер разрешает Discourse отобразиться.
Фактическое поведение: Браузер блокирует отображение Discourse из-за наличия заголовка X-Frame-Options: SAMEORIGIN в ответе.
Примечание: Сервис работает через Cloudflare только с DNS. Мы пробовали удалить заголовок в режиме прокси, но не можем включить этот режим, так как Cloudflare фильтрует куки, необходимые для нашей реализации кастомного SSO. Поэтому на данный момент это решение для нас недоступно.