Я создал приложение, которое использует Discourse API и SSO в качестве провайдера.
В настоящее время приложение отображается внутри iframe, поэтому для корректной работы социального входа страницу /login необходимо открывать вне iframe в новой вкладке браузера.
На данный момент всё работает.
Проблема
Когда новый пользователь регистрируется через социальную кнопку, его корректно перенаправляет на сайт соцсети, но когда он возвращается в Discourse, возникает проблема: Discourse показывает модальное окно входа вместо окна с уже заполненными именем пользователя или адресом электронной почты.
Чтобы увидеть это модальное окно и завершить регистрацию, нужно закрыть окно входа, а затем вручную нажать кнопку «Регистрация».
Только для новых пользователей вход работает как положено.
Не упустил ли я что-то или есть ли какой-то контекст, который Discourse обрабатывает некорректно? Технически это должно работать одинаково.
Если хотите увидеть демонстрацию, дайте знать — я могу отправить вам короткое видео в личном сообщении (в нём содержатся конфиденциальные данные).
Если быть точнее, приложение используется в расширении Chrome. Мы используем iframe, потому что сейчас у нас нет другого выбора. Однако я всё ещё не понимаю, в чём разница между программным открытием новой вкладки браузера с адресом /login или /signup из iframe и ручным открытием вкладки и нажатием на кнопку входа/регистрации.
Можно ли это исправить в Discourse?
В данный момент мы используем Discourse как провайдера SSO. Есть ли другие способы?
Если да, то какой из них будет лучшим для реализации входа/регистрации в данном контексте?
Я не встраиваю Discourse в iframe. Я использую API для отображения сообщений темы.
Я не пытаюсь войти/зарегистрироваться внутри iframe, потому что социальные сайты не разрешают отображаться в них. Поэтому, когда пользователь нажимает кнопку внутри iframe, открывается новая вкладка браузера на страницу /login в Discourse.
Технически, когда пользователь нажимает кнопку входа, открывается новая вкладка с /session/sso_provider. return_sso_url будет содержать URL на бэкенд для обработки данных, сохранения информации о сессии пользователя, а затем ответа в виде HTML для автоматического закрытия окна. Приложение затем определит, что процесс завершен, и автоматически перезагрузится, чтобы использовать сохраненную сессию пользователя.
Даже если приложение не находилось бы в iframe, скорее всего, произошло бы то же самое. Поскольку это расширение браузера, у вас все равно нет выбора, кроме как открывать новую вкладку. Я задаюсь вопросом, есть ли лучшие способы входа/регистрации в этом случае.
РЕДАКТИРОВАНИЕ: Вот демо (не предназначалось для публики, но это самый короткий способ показать проблему, и мне кажется, что я недостаточно хорошо объясняю): удалено, видео удалено, никому все равно
РЕДАКТИРОВАНИЕ 2: Похоже, это происходит только при использовании API /session/sso_provider; если я открываю URL Discourse напрямую (все еще из iframe), проблема, кажется, не возникает.