Мы используем OpenID для входа, и, похоже, эта опция доступна только при использовании DiscourseConnect. Есть ли другой способ? Вручную заполнять их довольно утомительно.
Мы действительно разрешаем пользователям редактировать свой адрес электронной почты (отдельно от SSO) на сайтах Discourse, но идентификатор пользователя гарантированно остаётся одинаковым.
Мой первоначальный ответ (вопросы ещё остаются без ответа)
Привет, @mattdm, не могли бы вы прояснить несколько моментов:
Может ли email пользователя отличаться между его учётными записями на WordPress и Discourse?
Что вы имеете в виду под фразой «идентификатор пользователя гарантированно остаётся одинаковым»? О каком именно идентификаторе пользователя идёт речь?
Ой, извините — я был уверен, что уже отвечал на это, но, похоже, нет? Может, я просто об этом подумал! В любом случае:
Электронная почта изначально синхронизируется через SSO как для WordPress, так и для Discourse. Однако, по многочисленным просьбам пользователей, мы позволяем изменять этот адрес в Discourse. (Оказывается, часто возникает желание получать уведомления Discourse на адрес, отличный от того, что привязан к аккаунту для входа.) Также можно изменить адрес электронной почты в WordPress, но я не знаю, делает ли кто-то это, или даже работает ли исходящая почта на этом экземпляре.
Под «user id» я имел в виду «username». Имя пользователя всегда[1] берётся из SSO как для Discourse, так и для WordPress, и не может быть изменено пользователем ни в одном из случаев. По какой-то причине, мне неизвестной, но, вероятно, имевшей смысл на тот момент, в нашей системе SSO это поле называется nickname; оно сопоставляется с oauth2 json username path.
На самом деле оказывается, что есть несколько аккаунтов, подобных моему, которые были созданы до внедрения SSO, и в них допущена ошибка — я значусь как «Matthew Miller» вместо mattdm. Но мы могли бы это исправить. ↩︎
У части ваших пользователей будут разные адреса электронной почты в WordPress и Discourse.
Ваше имя пользователя гарантированно будет одинаковым, так как оно предоставляется вашим провайдером идентификации как для WordPress, так и для Discourse.
Если бы мы разделили веб-хук пользователя WP Discourse от функциональности DiscourseConnect (это возможно), то сопоставление пользователей происходило бы на основе адреса электронной почты, а не имени пользователя. Ваша ситуация несколько специфична для вашей настройки идентификации.
Я думаю, что этот случай лучше обрабатывать с помощью пользовательского кода в WordPress. То, что вам нужно, выглядит примерно так:
По сути, просто присваивайте поле мета-данных discourse_username имени пользователя WP после входа, так как они гарантированно совпадают. Обратите внимание, что “user_login” — это то, как иногда называют “username” в коде WordPress.
Где-то по пути мы изменили настройку так, что адреса электронной почты теперь принудительно синхронизируются из нашего SSO (oauth2). Так что мы должны быть способны выполнять сопоставление именно таким образом. (И даже если по какой-то причине возникнет несоответствие, не должно быть ситуации, когда адрес электронной почты принадлежит другому человеку, поэтому в худшем случае это просто не сработает, верно?)
Есть ли шанс сделать так, чтобы веб-хук пользователя WP Discourse просто работал?
Если нет… Я не эксперт по WordPress, и наш WordPress размещен на хостинге, поэтому я не уверен, что у нас есть простой вариант настройки плагина.
Просто заметка: он сейчас работает. Вы просите о новой функции
Более того, вы просите о новой функции, к которой нужно подходить с большой осторожностью. Я знаю, что несколько лет назад я говорил, что это возможно, однако сейчас я немного опасен внедрять это как основную функцию плагина, поскольку такая функция должна предполагать, что адреса электронной почты в WordPress правильно валидируются, а это не всегда безопасное допущение.
Это (валидация email в WordPress) — ответственность администратора сайта. Однако один из принципов разработки с открытым исходным кодом — избегать создания чего-либо, что может привести к негативным последствиям даже в небольшом количестве случаев, особенно если у вас нет контроля над окружением. Эта проблема всё ещё существует, но смягчена, когда речь идёт только о DiscourseConnect.
Я ещё раз внимательно рассмотрю этот вопрос и вернусь к вам в конце этой недели.
Если сопоставление по электронной почте слишком сложное, мне кажется, что утверждение «Имена пользователей Discourse всегда совпадают с WordPress (и наоборот)» не может быть таким уж редким.
Даже если у кого-то нет системы SSO, предполагающей уникальное имя пользователя, surely должно существовать множество небольших сайтов, скажем, с десятком пользователей WordPress, где это верно по соглашению.
Для этого уже существует своего рода решение. Discourse можно настроить как провайдера DiscourseConnect для WordPress (обратное от обычной конфигурации). Это легко настроить. При включении этой опции появляется дополнительная настройка, позволяющая синхронизировать учётные записи WordPress и Discourse на основе адреса электронной почты пользователя.
Более того, на странице профиля пользователя появляется ссылка:
(редактирование: можно ли добавить подпись к изображению без использования ИИ?)
Прямо сейчас я провожу тестирование: при нажатии на ссылку на странице профиля поле «Имя пользователя Discourse» не заполняется, хотя должно. Однако при нажатии на ссылку «Войти через Discourse», которую можно добавить на страницу входа, поле «Имя пользователя Discourse» автоматически обновляется.
Полагаю, суть синхронизации учётных записей заключается в безопасном обновлении поля «Имя пользователя Discourse», поэтому стоит разобраться, что именно происходит в данном случае. Также, похоже, существует проблема: учётные записи с «неподтверждённым» адресом электронной почты в WordPress могут синхронизироваться с Discourse. По умолчанию это, вероятно, не должно быть разрешено.
В вашем случае вам может не потребоваться разрешать пользователям вход в WordPress через Discourse. Должно быть достаточно использовать ссылку на странице профиля, чтобы пользователи могли синхронизировать свои учётные записи и автоматически заполнять поле имени пользователя в Discourse. Для этого не обязательно включать вход в WordPress через Discourse.
Возможным недостатком такого подхода является то, что инициатива должна исходить от самих пользователей. Это не предоставит кнопку, которую администраторы могли бы нажать, чтобы получить имя пользователя в Discourse.
Это кажется глупым. У нас уже есть централизованный SSO. Нам не следует настраивать некоторые из наших сервисов так, чтобы они использовали другие случайные сервисы в качестве провайдера аутентификации, просто чтобы заставить их работать вместе. Это прямой путь к безумию.
Не сбивайтесь с толку названием (DiscourseConnect). Если бы описанная мною функция работала как положено, она была бы просто способом для пользователя WordPress подтвердить, что у него есть аккаунт Discourse с соответствующим адресом электронной почты, и автоматически получить имя пользователя Discourse в WordPress. Это не повлияло бы на систему аутентификации вашего сайта.
В основном плагине никогда не будет механизма сопоставления идентичности между именем пользователя WordPress и именем пользователя Discourse, даже за настройкой. Единственная возможность в данном контексте — сопоставление по электронной почте. Я решил добавить сопоставление по электронной почте как механизм резервного копирования для вебхука пользователя. Это будет включено в следующую версию, которая выйдет через несколько недель.
Чтобы завершить этот вопрос, в последней версии плагина 2.5.4 было внесено несколько обновлений в работу вебхуков, включая отмену требования DiscourseConnect для настройки «Сопоставление пользователей по электронной почте». Подробнее см. по ссылке: