Я настроил Discourse Connect, где WordPress выступает основным узлом для регистрации и входа.
У меня есть две формы регистрации пользователей с разными сценариями:
Стандартная регистрация с главной страницы (это старая форма, и она всё ещё создаёт пользователя в Discourse).
Регистрация пользователя через инструментальный сценарий (эта форма создаёт пользователя в WordPress, но не создаёт пользователя в Discourse).
В настройках плагина Discourse я не вижу параметров, специфичных для формы регистрации. Когда я перехожу к профилю пользователя, я не вижу имени пользователя Discourse в WordPress для второй формы. Ссылка
У меня два вопроса:
Что я могу упускать? Требуется ли какая-либо дополнительная настройка, чтобы это работало для новой формы?
Как создать пользователя в Discourse и связать его с WordPress для членов, которые уже существуют в WordPress?
Уточнение: При дальнейшем анализе выяснилось, что даже из первой формы некоторые пользователи не создаются в Discourse.
Пользователь переходит к форме и вводит имя, адрес электронной почты и пароль.
Затем пользователь автоматически входит в систему.
После этого, когда пользователь нажимает на ссылку сообщества, он автоматически входит в Discourse (поскольку плагин Discourse Connect уже выполнил свою задачу по созданию нового пользователя в Discourse).
Для второй формы:
Пользователь вводит имя и адрес электронной почты.
Мы предоставляем ему временный пароль.
Остальной процесс такой же, то есть пользователь автоматически входит в систему при регистрации.
Однако в этом случае пользователь не создается в Discourse.
Я не вижу никаких настроек в Discourse Connect, которые срабатывали бы при изменении формы регистрации. Возможно, существует хук, который должен вызываться при регистрации пользователя в WordPress, но не вызывается в случае второй формы?
Кстати, какой именно хук в WordPress используется для создания пользователя в Discourse? Должен же быть сделан вызов API для активации действий в Discourse. Не могло ли это по какой-то причине не сработать?
Что происходит с такими пользователями, когда они нажимают «Войти» в Discourse? Опишите точно, что происходит при попытке входа. Я понимаю, что пользователь не отображается в вашей панели администратора после создания в WordPress, но это немного другой вопрос.
Первый случай: пользователь зарегистрирован в WP
Пользователю не нужно нажимать кнопку «Войти» в Discourse; он автоматически авторизуется при переходе по следующей ссылке в WP:
Если же я просто использую ссылку https://community.showprowess.com/ для перехода из WP в Discourse, пользователь остаётся неавторизованным, и мне приходится нажимать кнопку «Войти» в Discourse, чтобы выполнить вход.
После входа пользователь остаётся авторизованным до тех пор, пока я не выйду из системы в WP.
Это создаёт проблему: если пользователь не нажмёт на ссылку /session/sso?return_path=/, он не будет авторизован. Это ограничивает возможность перенаправления пользователя из WP на страницу личных сообщений в Discourse (функциональность, необходимая для нашего продукта).
Поскольку это первая ссылка, на которую я нажимаю, окно сообщения не открывается. Вместо этого я авторизуюсь в Discourse. Теперь мне приходится возвращаться назад и снова нажимать ту же ссылку (ссылку на сообщение), чтобы она сработала.
Выглядит это так:
Это раздражает пользователей.
Ранее всё работало отлично: пользователь автоматически авторизовывался в Discourse, и ссылка https://community.showprowess.com вела на уже авторизованную страницу Discourse. Возможно, авторизация осуществлялась через куки браузера или что-то подобное, но сейчас это больше не работает.
Когда пользователь не зарегистрирован в Discourse
Это происходит в обоих случаях: как на новой, так и на старой форме.
В данном случае я снова выполнил вход и прошёл процесс онбординга, и на этот раз пользователь был создан в Discourse. До этого пользователь в Discourse отсутствовал (я проверил список новых пользователей в панели администратора перед повторным входом).
Я выполнил те же действия, что и выше: нажал на ссылку /sessions для автоматической авторизации в Discourse. Если же нажать просто на домен сообщества, вход не выполняется.
К сожалению, мне не удалось воспроизвести ситуацию, когда пользователь не создаётся при регистрации, но появляется при первом входе. Это происходит не при каждой новой регистрации пользователя, что очень странно.
Честно говоря, я немного запутался в том, как это описание вашей проблемы связано с вашим предыдущим описанием проблемы, вызванной наличием двух разных форм регистрации в WordPress. Но, думаю, я всё же смогу вам помочь.
Один важный момент: не существует (и никогда не существовало) способа мгновенно войти в систему сразу в двух разных сервисах на двух разных доменах. Всякий раз, когда кажется, что вы вошли в сервис A на домене A, а при переходе в сервис B на домене B вы тоже уже авторизованы, на самом деле произошло следующее: вы вошли в сервис B через сервис A только после того, как посетили домен B и был инициирован процесс входа. До этого момента входа не было.
Ещё один важный момент: за исключением конкретного сценария, который вы описываете (когда нужно перенаправить пользователя в определённое место приложения, требующее сессию), большинство пользователей не обращают внимания на то, что иногда им нужно нажать кнопку «Войти» в сервисе B. По моему опыту работы с клиентами над решениями для идентификации, администраторы сайтов обычно гораздо более чувствительны к этому, чем сами пользователи.
Принцип работы здесь не изменился. Всякий раз, когда кажется, что пользователь «автоматически» вошёл в систему, на самом деле происходит следующее: его перенаправляют обратно в WordPress, а затем снова в Discourse после того, как его сессия в WordPress будет аутентифицирована. Если пользователь уже авторизован в WordPress, то кажется, что он «автоматически» вошёл в Discourse, поскольку это перенаправление происходит без каких-либо действий со стороны пользователя.
Один из способов инициировать «автоматический» вход и перенаправить пользователя в определённое место в Discourse после входа — использовать путь, который вы уже предоставили:
https://community.showprowess.com/session/sso?return_path=[любой путь в Discourse]
Если пользователь уже авторизован в WordPress, но ещё не вошёл в Discourse при использовании этого URL, произойдёт следующее:
Discourse автоматически запускает процесс входа DiscourseConnect.
Браузер пользователя перенаправляется в WordPress.
Пользователь уже авторизован, поэтому его автоматически перенаправляют обратно в Discourse.
Если в URL, использованном на шаге 1, было указано значение return_path, пользователь будет перенаправлен туда.
С точки зрения пользователя его браузер лишь ненадолго начнёт загружать страницу, но фактически он «автоматически» войдёт в Discourse и будет перенаправлен в определённую часть приложения.
Обратите внимание: параметр return_path можно установить как любой URL, даже на отдельный домен, если включить настройку сайта discourse connect allows all return paths и установить её значение в true.
Спасибо! Это помогло решить проблему автоматического входа пользователя из WordPress в Discourse. Я могу использовать return_path для перенаправления пользователя на любую страницу в Discourse. Это решает проблему перенаправления пользователя на страницу сообщений.
Однако я до сих пор не понимаю, почему в некоторых случаях пользователь не создаётся в Discourse, хотя он уже создан в WordPress. Вы знаете, когда именно пользователь создаётся в Discourse через SSO?
Это происходит при создании пользователя в WP?
Или это происходит, когда новый пользователь WordPress пытается получить доступ к Discourse, после чего он создаётся, входит в систему и перенаправляется в Discourse?
Какой хук мы используем в WP для создания пользователя в Discourse?
Я пытаюсь понять, какой крайний случай может привести к тому, что пользователь не будет создан в Discourse при создании его в WP.
Практический пример:
Я еженедельно приветствую новых пользователей сообщением. На прошлой неделе в WP зарегистрировались 30 пользователей, но в Discourse были созданы только 16. Когда я хочу упомянуть их в приветственном сообщении, я не могу отметить всех — это для меня очень странно.
При настройках по умолчанию пользователи создаются в Discourse в первый раз, когда они входят в систему через DiscourseConnect. До этого момента пользователь в Discourse не существует.
Плагины WP Discourse также имеет настройку «Создавать или синхронизировать пользователей Discourse при входе», которая при включении создаст пользователя через API Discourse после регистрации пользователя в WordPress. Эта настройка использует действие wp wp_login, поэтому процесс регистрации вашего пользователя должен запускать это действие, чтобы эта функция работала.
У меня включена настройка «Создавать или синхронизировать пользователей Discourse при входе». Пользователь не создаётся в Discourse, потому что некоторые пользователи регистрируются в WordPress, но не заходят в сообщество при первом входе. Они могут вернуться, войти в систему, а затем перейти по ссылке на сообщество — и только тогда пользователь будет создан.
Текущая функция автоматического входа после регистрации в WordPress не использует действие wp_login:
add_action( 'cred_save_data', 'cred_autologin_V3', 10, 3 );
function cred_autologin( $post_id, $form_data ){
if ( ID1 == $form_data['id'] ) { // Измените по необходимости
wp_set_current_user( $post_id );
wp_set_auth_cookie( $post_id );
// wp_redirect( home_url( '/some-ending-page/' ) );
// exit();
}
}
Я бы предпочел создавать пользователя в Discourse сразу при регистрации в WordPress.
У меня есть пользовательские хуки на форме регистрации пользователя, через которые можно вызывать API. Есть ли код, который я могу добавить в пользовательский хук, чтобы создать пользователя в Discourse через API?
Вот эта часть мне непонятна: как именно вызвать wp_login из пользовательского хука.
Я рекомендую вам ознакомиться с документацией по этому действию. Документация WordPress будет для вас более полезным ресурсом, чем я. К сожалению, я не смогу помочь вам определить наилучший способ интеграции вашего пользовательского кода входа в WordPress.
Что касается возникшей у вас проблемы, я думаю, мы выяснили её причину.