Ошибка встраивания

Привет, команда поддержки!

При попытке встраивания с помощью предоставленного JS-сниппета процесс зависает на этапе «Загрузка обсуждения», и я получаю следующую ошибку:
Invalid X-Frame-Options: “ALLOWALL” header from ...

Как можно решить эту проблему?

Спасибо!

Это может быть запоздало, но я столкнулся с той же проблемой и был бы признателен за ответ здесь. Моя проблема проявлялась только при использовании Firefox. Chrome работал без проблем. Я исправил это, добавив сайт, встраивающий контент, в настройку «разрешённые CORS-источники». Основную информацию получил здесь.

Я только что заметил, что и наши сайты столкнулись с этой проблемой, но только с новыми постами, а не с существующими, для которых уже была создана сопутствующая тема. Заголовок Invalid X-Frame-Options кажется скорее предупреждением Firefox, чем реальной ошибкой, так как он всегда появляется, даже если встраивание проходит успешно.

Рабочий пример (с существующей темой, когда встраивание работало ранее):

А вот эта целевая страница:

в итоге получает ответ 400 (ошибка запроса) от нашего экземпляра Discourse.

Я перерыл эти форумы и документацию в поисках причины этого, но пока ничего не нашел. Думал, что это может быть связано с включением имени пользователя Discourse в полезную нагрузку встраивания, но это также происходит с контентом, созданным пользователями, которые правильно синхронизированы (например, Winter School on Agent-Based Modeling of Social-Ecological Systems).

Что я уже проверил:

  1. Установлено значение DISCOURSE_ENABLE_CORS: true
  2. В настройках Discourse указаны правильные хосты для CORS с протоколом https
  3. Разрешенные хосты настроены корректно (также встраивание работает для уже созданных постов Discourse)

Есть ли что-то еще, что мне стоит рассмотреть? Единственное, что приходит в голову, — это то, что мы недавно интегрировали наши сайты с CloudFlare, поэтому, возможно, требуется какая-то настройка CloudFlare, чтобы всё работало правильно. Меня всё ещё сбивает с толку, почему существующие темы работают корректно…

Попробуйте временно отключить Cloudflare и посмотрите, поможет ли это. Это довольно просто сделать…

Хорошая идея, я попробовал это на нашем тестовом сайте, но, к сожалению, это не помогло..

В Chrome я вижу ошибки следующего вида:

Не удалось выполнить 'postMessage' в 'DOMWindow': Указанный целевой источник ('https://test-discourse.comses.net') не совпадает с источником окна-получателя ('https://test.comses.net').

(из https://test.comses.net/codebases/f0613922-9cb1-4656-a26c-af57f823fb69/releases/3.2.0/)

Другие здесь смогли исправить это, убедившись, что DiscourseEmbed.discourseEmbedUrl совпадает с URL-адресом страницы, на которой находится вставка, но я проверил, что он всё ещё верный.. Я посмотрел логи Discourse (должен ли я смотреть в /var/discourse/shared/standalone/log/rails/production.log?), но и там ошибок не обнаружил.. Есть ещё какие-то идеи, где можно искать проблему?

Пример из логов Discourse:

Started GET "/embed/comments?embed_url=https%3A%2F%2Ftest.comses.net%2Fcodebases%2Ff0613922-9cb1-4656-a26c-af57f823fb69%2Freleases%2F3.2.0%2F" for 72.201.57.141 at 2020-08-05 05:15:40 +0000
Processing by EmbedController#comments as HTML
  Parameters: {"embed_url"=>"https://test.comses.net/codebases/f0613922-9cb1-4656-a26c-af57f823fb69/releases/3.2.0/"}
  Rendering embed/loading.html.erb within layouts/embed
  Rendered embed/loading.html.erb within layouts/embed (Duration: 0.4ms | Allocations: 134)
Completed 200 OK in 91ms (Views: 1.8ms | ActiveRecord: 0.0ms | Allocations: 16308)
Started GET "/service-worker-c8000968830b6f6bd33f1e842dffdd569664119d449f93dc7d428d963a71635d.js" for 72.201.57.141 at 2020-08-05 05:15:42 +0000
Processing by StaticController#service_worker_asset as */*
  Rendering text template
  Rendered text template (Duration: 0.0ms | Allocations: 1)
Completed 200 OK in 27ms (Views: 1.3ms | ActiveRecord: 0.0ms | Allocations: 6617)

У меня та же проблема. Вы можете увидеть это в реальном времени, например, здесь: Making sure you're not a bot!, где внизу встроена дискуссия с @mock/mock - Fedora Discussion. Обратите внимание, что discussion.fedoraproject.org — это платный экземпляр, предоставляемый как услуга платформой Discourse.

Что меня сбивает с толку, так это то, что дискуссия иногда загружается, а иногда нет. Мне удаётся воспроизвести проблему (почти всегда) в приватном режиме Firefox (версия 80).

Инструменты разработчика показывают:

При загрузке «https://discussion.fedoraproject.org/embed/comments?embed_url=https%3A%2F%2Fcopr.fedorainfracloud.org%2Fcoprs%2Fg%2Fmock%2Fmock%2F» обнаружен некорректный заголовок X-Frame-Options: «ALLOWALL» не является допустимой директивой.

И действительно, в документации X-Frame-Options header - HTTP | MDN значение ALLOWALL не упоминается.

Похоже, что тема, на которую вы ссылаетесь по адресу https://discussion.fedoraproject.org/t/mock-mock/3107, находится в защищённой категории — я не могу получить к ней доступ как анонимный пользователь. Поскольку ваш форум на Discourse и ваш веб-сайт используют одно и то же корневоe доменное имя, я ожидаю, что встроенные комментарии будут загружаться для пользователей, вошедших в форум, но не будут загружаться для тех, кто не авторизован. Похоже ли это на то, что вы наблюдаете?

Я ожидал, что встроенные комментарии будут загружаться для пользователей, вошедших в форум, но не будут загружаться для тех, кто не авторизован. Похоже ли это на то, что вы наблюдаете?

Действительно, похоже, что так и есть. Мне удалось воспроизвести это поведение как в Google Chrome, так и в Firefox. Однако в приватном режиме обоих браузеров обсуждение не загружается — не знаю, имеет ли это какое-то значение. Но, думаю, это всё же указывает на необходимость обновить категорию, чтобы её мог видеть каждый.

Спасибо. После редактирования категории и добавления вкладки «Безопасность» с разрешением для «всех» на «создание/ответ/просмотр» встраивание снова работает.

Итак, после последнего обновления Discourse все встроенные страницы теперь выдают ошибку :sweat_smile:

Обычное сообщение об ошибке, которое мы видим сейчас, выглядит примерно так, что, по-видимому, указывает на то, что браузер удаляет заголовок Referer, из-за чего код встраивания Discourse не проходит проверку:

Referer: `https://www.comses.net/`

Заголовок Referer либо не был отправлен, либо не совпадает ни с одним из следующих хостов:

* www.comses.net/codebases/.* 

Пример страницы: Artificial Anasazi

В Chrome, даже с отключёнными Privacy Badger и всеми остальными расширениями, сообщение об ошибке Referer всегда появляется. Вероятно, это связано с A new default Referrer-Policy for Chrome - strict-origin-when-cross-origin  |  Blog  |  Chrome for Developers ОБНОВЛЕНИЕ: теперь это работает для существующих тем после явного указания политики Referrer-Policy на исходном сайте (например, https://www.comses.net). Для haproxy это выглядит примерно так: http-response set-header Referrer-Policy "no-referrer-when-downgrade".

В Firefox и Chrome страницы со существующими темами работают, но страницы, на которых попытка создать новую тему, завершаются ошибкой, как здесь: The Bronze Age Collapse model (BACO model).

Я изменил конфигурацию haproxy, чтобы добавить заголовки ответа для Content-Security-Policy frame-ancestors, что исправило ошибку в Firefox «invalid X-Frame-Options ALLOWALL not recognized», но теперь запрос завершается тайм-аутом и в итоге приводит к ошибке 400 Bad Request на нашем форуме Discourse.

Ошибка, похоже, связана с postMessage:

Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://forum.comses.net') does not match the recipient window's origin ('https://www.comses.net').

У меня появится больше времени для более глубокого анализа в конце этого месяца, когда у меня будет немного свободного времени, но я хотел поделиться мыслями, пока всё ещё свежо — надеюсь, кто-то другой найдёт обходное решение до этого момента! :grin:

У меня то же самое. Надеюсь, кто-нибудь здесь сможет немного помочь с этой ошибкой. В моем случае у меня есть тестовый блог и официальный блог… оба созданы на Webflow… в тестовом блоге всё работает нормально, но в работающем блоге возникает эта ошибка…

### Ошибка встраивания


Реферер: `https://www.pynk.io/blog/what-to-invest-in-look-around-you`

Реферер либо не был отправлен, либо не совпал ни с одним из следующих хостов:

[пустое место здесь]

Извините за поздний ответ. Попробуйте добавить discourseReferrerPolicy: 'no-referrer-when-downgrade' в объект DiscourseEmbed, который задан в фрагменте кода для встраивания. Полный пример кода с добавлением этого свойства можно найти здесь: Embed Discourse comments on another website via Javascript - #353.

Если вы попробуете это сделать, пожалуйста, сообщите нам, решило ли это вашу проблему.

Думаю, это было решено здесь: Embed Discourse comments on another website via Javascript - #365. В том случае проблема заключалась в отсутствии поддомена www в записи хоста для встраивания Discourse.

Редактирование: эта проблема теперь исправлена в основном коде Discourse. Больше нет необходимости устанавливать переменную discourseReferrerPolicy в значение 'no-referrer-when-downgrade'. Discourse теперь по умолчанию устанавливает политику реферера в 'no-referrer-when-downgrade'. Подробнее об этом см. по адресу: https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963#setting-the-referrer-policy.

Добавление discourseReferrerPolicy решило проблему — спасибо, @simon !! :100:

Это может вызывать проблемы с SSO. У меня есть current.discourse.example, использующий sso.discourse.example в качестве хоста SSO. Когда вы вошли в систему, список тем отображается корректно. Но когда вы анонимны, они не отображаются, и выводится вышеуказанная ошибка. URL /embed/topics?... показывает пустую страницу.

Я думаю — или надеюсь — это должно быть исправлено с помощью:

Content-Security-Policy: frame-ancestors https://current.discourse.example https://sso.discourse.example;