SSO и встраивание

У нас настроен экземпляр Discourse с SSO (с использованием SAML/Shibboleth), и я настроил его для разрешения встраивания контента на другой поддомен, который также использует тот же SSO.

Вот проблема, с которой я столкнулся:

  1. Пользователь посещает страницу на поддомене X, на которой встроена тема из Discourse, размещенного на поддомене Y.
  2. Пользователь перенаправляется на поддомен Z для входа через SSO. После этого его перенаправляют обратно на поддомен X.
  3. Страница на поддомене X загружает JavaScript-файл для встраивания, который создает iframe, пытающийся загрузить тему форума. Однако Discourse (поддомен Y) перенаправляет iframe на поддомен Z для SSO, и, поскольку пользователь уже вошел в систему, его снова перенаправляют на URL встраивания Discourse. Но это приводит к ошибке 400 «Error Embedding», так как URL-ссылка (referer) теперь поступает с поддомена Z (поддомен SSO), а не с поддомена X (домен, одобренный/включенный в белый список для встраивания). Discourse возвращает сообщение: «Ссылка-источник либо не была отправлена, либо не соответствует ни одному из следующих хостов».
  4. При обновлении страницы всё работает идеально (то есть тема форума загружается успешно), вероятно, потому что браузер теперь имеет действительный cookie сеанса, что устраняет необходимость перенаправления на поддомен SSO.

Есть ли способ исправить это должным образом? В настоящее время у меня есть очень неуклюжий обходной путь: сначала тема форума загружается в скрытый iframe, затем выжидается 1 секунда, после чего тема загружается на реальную страницу, видимую пользователю.

Буду признателен за любую помощь или предложения!

Проведя дополнительное исследование, я задумался, не будет ли менее «костыльное» решение, если адаптировать подход, описанный @simon в этом посте: Automatically login via SSO - #4 by simon

  1. Включить настройку «sso allows all return paths».
  2. Добавить на свою страницу скрытый iframe, который загружает https://discourse.example.com/session/sso?return_path=path_to_mypage.html.
  3. Когда пользователь вошёл в систему (без взаимодействия, так как он уже авторизован через SSO в приложении на родительской странице) и iframe перенаправляется на mypage.html, он может через postMessage() сообщить родительской странице, что пользователь вошёл в Discourse, и запустить скрипт для встраивания темы форума.

Это всё ещё не кажется идеальным решением, поскольку будут создаваться дополнительные циклы запросов (описанный выше процесс действительно необходим только если пользователь ещё не вошёл в Discourse).

Мне кажется, идеальное решение заключалось бы в том, чтобы каким-то образом сохранять URL страницы-источника (referer URL) страницы, которая встраивается, при её перенаправлении через SSO.

Редактирование: Я реализовал улучшенный «костыль», описанный выше в этом посте, и могу с уверенностью сказать, что он работает намного лучше оригинального «костыля», описанного мной в первом сообщении.