Я использую форум Discourse в качестве раздела комментариев для своего блога, который находится на другом домене.
Я пытаюсь внедрить полное приложение Discourse, но пользователи не могут войти в систему, отвечать или взаимодействовать каким-либо образом из этого внедрения.
Когда кто-то пытается ответить, его перенаправляет на страницу входа, даже если он уже вошел в систему.
Вход в систему на стороне форума не помогает.
Похоже, это проблема с межсайтовыми cookie-файлами.
Есть ли какой-либо обходной путь?
Есть ли решение?
Извините, я не очень хорошо разбираюсь во всех этих вопросах, связанных с cookie-файлами, поэтому использовал ИИ, чтобы понять, что происходит, и найти возможные решения.
Если вы не любите ИИ, можете остановиться здесь.
Ниже я привел то, что получил от него, но сам этот пост, включая все форматирование, был написан с помощью моего естественного интеллекта.
Как Gemini обобщил проблему.
Gemini:
Внедрение «Полного приложения» не распознает активные сессии пользователей, когда форум и сайт используют разные домены.
Это происходит потому, что браузер воспринимает встроенный форум как сторонний трекер.
Современные браузеры по умолчанию блокируют сторонние cookie-файлы для защиты конфиденциальности пользователей.
Сессионные cookie-файлы Discourse настроены как SameSite=Lax.
Браузеры не отправляют cookie-файлы Lax внутри iframe, если родительский домен отличается.
Поскольку cookie-файлы блокируются, форум не может увидеть данные входа пользователя.
Внедрение по умолчанию переходит в режим «Гость» и открывает новую вкладку, когда пользователь пытается взаимодействовать.
Очевидные решения, такие как добавление хоста в белый список в настройках Discourse, не работают.
Добавление в белый список только сообщает Discourse разрешить соединение; оно не может переопределить правила безопасности браузера.
Обновление страницы или повторный вход в новой вкладке также не помогает, поскольку блокировка на уровне браузера остается активной для iframe.
Внедрение по сути остается запертым в песочнице без cookie-файлов.
Похоже, есть правильные способы сделать это, но Discourse должен их реализовать.
Да, существуют официально поддерживаемые безопасные методы, но «старый способ» (просто установка cookie) устарел.
Чтобы сохранить вход в системе в iframe сегодня, необходимо использовать один из следующих трех «официальных» стандартов браузера. Выбор зависит от того, кто должен видеть сессию входа.
1. Метод «Частного хранилища»: CHIPS
Лучше всего подходит для: виджетов чата, встроенных карт или платежных форм, которым нужно оставаться в системе только на этом конкретном родительском сайте.
Как это работает: Вы устанавливаете cookie-файл с атрибутом Partitioned.
Set-Cookie: session_id=xyz; Secure; SameSite=None; Partitioned;
Результат: Браузер создает уникальное «хранилище cookie» для вашего iframe, привязанное к (Ваш домен + Домен родительской страницы).
Плюсы: Работает автоматически без запроса разрешения у пользователя.
Минусы: Сессия не общая. Если пользователь посетит ваш сайт напрямую в новой вкладке, он не будет там в системе. Он будет в системе только в контексте этого конкретного внедрения.
2. Метод «Общей сессии»: Storage Access API (SAA)
Лучше всего подходит для: случаев, когда iframe должен видеть ту же сессию входа, что и основная вкладка пользователя (например, виджет «Комментировать как [Пользователь]»).
Как это работает: Изначально iframe не может читать свои собственные cookie-файлы. Он должен вызвать специальный JavaScript API для запроса доступа:
document.requestStorageAccess().then(() => {
// Теперь вы можете читать свои межсайтовые cookie-файлы!
});
Подвох: Это требует действия пользователя (например, клика). Обычно сначала нужно отобразить кнопку «Нажмите для подключения». После клика браузер может запросить разрешение у пользователя («Разрешить [iframe] использовать cookie?»).
Плюсы: Предоставляет доступ к вашим «настоящим» глобальным cookie-файлам.
Минусы: Высокий уровень трения; требует взаимодействия пользователя/всплывающих окон.
3. Метод «Передачи токена» (Наиболее распространенный)
Лучше всего подходит для: SaaS-приложений, внедряющих свои собственные инструменты в панели управления клиентов.
Как это работает: Вы вообще не полагаетесь на cookie-файлы iframe.
Родительская страница обрабатывает вход в систему (или уже имеет токен).
Родитель передает токен аутентификации (JWT) в iframe через postMessage.
Iframe перехватывает токен и сохраняет его в памяти (или sessionStorage), чтобы прикреплять к запросам API.
Плюсы: Полное отсутствие зависимости от политик cookie-файлов браузера; полностью совместим со всеми браузерами.
Минусы: Требует изменений кода как на родительской странице, так и на сайте iframe.
Резюме и рекомендации
Если вам нужно…
Используйте…
Изолированный вход (Состояние виджета не должно совпадать с основным сайтом)
CHIPS (Разделенные cookie-файлы)
Глобальный вход (Пользователь уже вошел в систему на вашем сайте в другом месте)
Storage Access API
Контроль (Вы владеете как родительским сайтом, так и iframe)
Передача токена (postMessage)
Lilly
(Lillian )
05.Май.2026 00:01:32
2
Dev-in-the-BM:
Я пытаюсь использовать полное встраивание приложения Discourse, но пользователи не могут войти, ответить или как-либо взаимодействовать через встраивание.
Когда кто-то пытается ответить, его перенаправляет на страницу входа на новой вкладке, даже если он уже вошел в систему.
Ваша версия Discourse актуальна? Убедитесь, что вы обновились до последней версии. У меня нет проблем с ответами, когда я вошел в нужный форум.
Ответ от анонимного пользователя открывает новую вкладку для входа, как объясняется здесь:
Falco
(Falco)
05.Май.2026 00:35:34
3
Войдите в консоль Rails и установите значение атрибута same_site для куки сайта в «None».
cd /var/discourse
./launcher enter app
rails c
SiteSetting.same_site_cookies = "None"
Lilly:
Ваш Discourse обновлён?
Да.
В рамках одного домена или между разными сайтами?
Dev-in-the-BM:
Когда кто-то пытается ответить, его перенаправляют на страницу входа на новой странице, даже если он уже авторизован.
Вход в систему там не помогает.
Я об этом думал, но это крайне небезопасно, очевидно, что это плохая идея.
Просто заметка: человек, который это предложил, помог создать эту функцию .
RGJ
(Richard - Communiteq)
05.Май.2026 07:46:17
7
Встраивание между доменами тоже не всегда лучший вариант, но что поделать.