Настройка единого входа (SSO) с WP Discourse и DiscourseConnect

Плагин WP Discourse позволяет настроить DiscourseConnect в WordPress, чтобы ваши пользователи могли использовать свою учётную запись WordPress для входа в Discourse или свою учётную запись Discourse для входа в WordPress. Прежде чем настроить DiscourseConnect, сначала необходимо установить плагин WP Discourse на WordPress и подключить его к вашему Discourse. Если вы готовы начать, посмотрите короткое видео или следуйте инструкциям ниже.

Следующий шаг

После настройки DiscourseConnect вы можете ознакомиться со следующими темами:


Инструкции

Настройка секретного ключа

Независимо от того, настраиваете ли вы WP Discourse как провайдера или клиента DiscourseConnect, вам необходимо установить секретный ключ. Перейдите на вкладку «DiscourseConnect Secret Key» и введите строку текста (допускаются цифры, буквы и символы) длиной не менее 10 символов. Используйте те же правила создания, что и для надёжного пароля. Обязательно сохраните его после завершения.

Затем откройте настройки сайта Discourse (в панели администратора) и выполните поиск по запросу «discourse connect». Одно из настроек в верхней части будет называться discourse connect secret. Вставьте туда секретный ключ, установленный в WP Discourse, и нажмите зелёную галочку.

Вход в Discourse с помощью WordPress (провайдер DiscourseConnect)

Убедитесь, что ваш WP Discourse подключён к Discourse и секретный ключ настроен ( :point_up: ), прежде чем следовать этим инструкциям.

Чтобы пользователи могли входить в Discourse, используя учётные данные WordPress, необходимо настроить WP Discourse как провайдера DiscourseConnect. Перейдите на вкладку DiscourseConnect Provider в настройках WP Discourse, установите флажок Enable DiscourseConnect Provider и сохраните настройки.

Далее перейдите в настройки сайта Discourse, введите «discourse connect» в поле поиска, чтобы увидеть все настройки DiscourseConnect. Сначала установите значение discourse connect url равным URL-адресу вашего WordPress. Последний шаг — выбрать enable discourse connect. Убедитесь, что вы готовы к работе, прежде чем выбрать эту опцию, так как после этого пользователи смогут входить в Discourse только через WordPress.

После включения DiscourseConnect в Discourse, чтобы убедиться, что всё настроено правильно, откройте окно в режиме инкогнито в вашем браузере. Оставьте обычное окно (не инкогнито) браузера с входом в учётную запись администратора (на случай, если что-то пойдёт не так и вам потребуется вернуть настройки). В окне инкогнито вы заметите, что кнопка «Sign Up» в Discourse больше не отображается. Нажмите кнопку «Log In». Вы должны увидеть экран входа в WordPress. Введите свои учётные данные WordPress для входа. После этого вы должны быть перенаправлены обратно в Discourse и авторизованы.

Если что-то пойдёт не так или вы заметите какие-либо несоответствия, вернитесь в обычное окно браузера и отключите enable discourse connect, чтобы пользователи могли входить в Discourse обычным способом. Если по какой-то причине вы больше не авторизованы в учётной записи администратора в обычном окне браузера, ознакомьтесь с разделом «Отключение DiscourseConnect через консоль Discourse» в разделе устранения неполадок ниже, чтобы восстановить доступ к вашему Discourse.

Подтверждение электронной почты

Discourse ожидает, что все адреса электронной почты пользователей будут подтверждены, а WordPress не требует от пользователей подтверждения адреса электронной почты. В стандартной настройке WordPress довольно легко подтвердить адрес электронной почты пользователя в процессе регистрации, но если сайт использует плагин, создающий форму регистрации на фронтенде (например, форму регистрации, которую можно добавить с помощью WooCommerce), плагин WP Discourse не сможет подтвердить адрес электронной почты пользователя.

Если адреса электронной почты пользователей не подтверждаются в WordPress, прежде чем пользователь WordPress сможет войти на форум, ему потребуется ответить на уведомление о подтверждении электронной почты, отправленное Discourse. Плагин содержит несколько фильтров, которые можно использовать для переопределения этого поведения. Изучите код, начиная здесь, для получения подробной информации.

Удаление флага require_activation

Если вы уверены, что WordPress проверяет адреса электронной почты, вы можете сообщить Discourse, что ему это не нужно. Чтобы полностью удалить флаг require_activation, добавьте что-то подобное в ваш WordPress (например, в файл functions.php вашей темы):

// Замените 'my_prefix' на префикс вашего сайта.

add_filter( 'discourse_email_verification', 'my_prefix_discourse_email_verification' );
function my_prefix_discourse_email_verification( $require_activation ) {
    return false;
}

Чтобы удалить флаг require_activation для конкретных пользователей, используйте что-то подобное:

// Замените 'my_prefix' на префикс вашего сайта.

add_filter( 'discourse_email_verification', 'my_prefix_discourse_email_verification', 10, 2 );
function my_prefix_discourse_email_verification( $require_activation, $user_id ) {
    $user = get_userdata( $user_id );
    if ( /* какое-то условие, проверяемое для $user */ ) {

        return true;
    }

    return false;
}

Веб-хук Userdata

Этот веб-хук существует по историческим причинам — автоматическое заполнение поля имени в Discourse теперь можно выполнить с помощью опции провайдера DiscourseConnect «Create or Sync Discourse Users on Login».

Веб-хук Update Userdata (в панели настроек «Webhooks») можно использовать, когда WordPress является провайдером DiscourseConnect для вашего Discourse. Веб-хук автоматически заполняет поле имени пользователя в Discourse на WordPress.

Создание ссылки для входа DiscourseConnect

Если у вас включена опция провайдера DiscourseConnect, вы можете добавить ссылку для входа DiscourseConnect на свой сайт WordPress, создав ссылку со следующей структурой:

<a href="https://discourse.example.com/session/sso?return_path=/">Community</a>

Установите значение return_path равным странице на вашем форуме, на которой вы хотите, чтобы пользователь оказался. Вы можете добавить ссылку для входа SSO в меню WordPress, добавив URL-адрес с такой структурой как «Custom Link» в разделе «Меню» панели управления WordPress.

Вход в WordPress с помощью Discourse (клиент DiscourseConnect)

Чтобы ваш сайт функционировал как клиент DiscourseConnect для Discourse, перейдите на вкладку DiscourseConnect Client. На этой странице выберите опции Enable DiscourseConnect Client и Add Login Link.

Теперь перейдите на страницу администратора/настроек Discourse и выполните поиск по запросу «discourse connect», чтобы увидеть все опции DiscourseConnect.

  • выберите настройку «enable discourse connect provider»
  • скопируйте ваш DiscourseConnect Secret Key из WordPress в поле «secret» настройки «discourse connect provider secrets» в Discourse. В поле «domain» этой настройки введите домен вашего сайта WordPress. Затем нажмите зелёную галочку, чтобы сохранить настройки.

После завершения настройка «discourse connect provider secrets» в Discourse должна выглядеть следующим образом (с доменом, установленным в домен вашего WordPress):

Теперь Discourse должен функционировать как провайдер DiscourseConnect для вашего сайта WordPress.

Откройте свой сайт WordPress в окне браузера в режиме инкогнито. Когда вы перейдёте на страницу входа, вы должны увидеть ссылку «Log in with Discourse» под формой входа. Нажмите на неё, и вы будете перенаправлены на форму входа в Discourse. Войдите там, и вы будете перенаправлены обратно на страницу входа WordPress с уведомлением о необходимости синхронизации вашей учётной записи с Discourse. Следуйте инструкциям в уведомлении для связывания учётных записей, и вы сможете войти в свой сайт WordPress через Discourse.

Примечание: это поведение влияет только на пользователей, у которых уже есть учётные записи как в WordPress, так и в Discourse. Новые учётные записи WordPress, созданные через DiscourseConnect, смогут свободно входить в WordPress при первом нажатии на ссылку «Log in with Discourse». Чтобы упростить вход через Discourse для пользователей, у которых уже есть учётные записи как на вашем сайте WordPress, так и на вашем форуме Discourse, выберите флажок Sync Existing Users by Email на вкладке опций DiscourseConnect Client.

Синхронизация выхода из Discourse

Когда DiscourseConnect включён, выход из Discourse можно синхронизировать с вашим сайтом WordPress, добавив home_url вашего сайта с параметром запроса request=logout в настройку сайта Discourse logout redirect. Эта настройка находится в разделе настроек Discourse по адресу /admin/site_settings/category/users. Вот пример URL-адреса «logout redirect»:

http://example.com/?request=logout

Устранение неполадок

Если у вас возникли проблемы с использованием WordPress в качестве провайдера DiscourseConnect для вашего форума, сначала проверьте следующее:

  • совпадают ли секретные ключи DiscourseConnect, установленные в WordPress и Discourse
  • выбрано ли у вас на сайте WordPress Enable DiscourseConnect Provider
  • введён ли правильный discourse connect url в Discourse.

Ошибка «Login Error» при использовании DiscourseConnect

Если пользователи получают сообщение «Login Error» при попытке входа в Discourse, ознакомьтесь с:

Debug and fixing common DiscourseConnect issues.

Отключение DiscourseConnect

Если DiscourseConnect не работает, вы можете отключить его, отключив настройку сайта enable discourse connect. Если вы не авторизованы в учётной записи администратора где-либо, чтобы отключить его, не беспокойтесь — есть несколько способов вернуться и отключить его.

Вход через /users/admin-login

Откройте новое окно браузера и введите URL-адрес вашего форума в адресной строке, добавив /users/admin-login, например:

https://community.mysite.com/users/admin-login

Вы увидите поле ввода, запрашивающее адрес электронной почты администратора. После отправки адреса электронной почты вы получите письмо со ссылкой, которая позволит вам войти напрямую в учётную запись администратора. Затем перейдите в настройки сайта и отключите enable discourse connect, чтобы выключить DiscourseConnect.

Если это не сработает по какой-то причине, не беспокойтесь — вы всё равно сможете отключить DiscourseConnect через консоль сервера (:point_down:)

Отключение DiscourseConnect через консоль сервера

Если вы не знаете, что такое консоль сервера, или у вас нет к ней доступа, обратитесь за помощью к вашему хостинг-провайдеру. После подключения к серверу по SSH выполните следующие команды:

cd /var/discourse
./launcher enter app
rails c
SiteSetting.enable_discourse_connect=false
exit
exit
11 лайков

Что делать, если у меня в Discourse нет этих опций? :confused:

Привет, @LosHunterros, добро пожаловать в Meta!

Discourse Connect не входит в базовый план хостинга
Screenshot_20240507_204846_Chrome

4 лайка

Спасибо за ваш ответ

1 лайк

Теперь мне нужен действительно уровень 101. Или просто «да» или «нет».

Мне нужен простой доступ к моему форуму из WordPress для этих клиентов. Поскольку они создали учётную запись в WordPress, я бы использовал её как провайдера.

Но у меня возникли проблемы с AI в Discourse. Я понял, что DiscourseConnect перехватит все остальные логины, включая Google, Microsoft и локальные. Однако AI очень уверенно утверждает, что это не так, если я установлю discourse connect allowed redirect domains.

Что ж, я это сделал. И всё равно перенаправление на WordPress происходит без каких-либо других вариантов входа.

Так что, я зря потратил два часа своей жизни из-за галлюцинаций AI, или я что-то сделал неправильно? Потому что если я был прав в начале и DiscourseConnect не позволяет другие логины, я сразу же его удалю. Жить без входа через Google в этом уголке Европы — не вариант.

Ваша первоначальная мысль была верной. ИИ ошибается: см. далее.

К сожалению, да.

1 лайк

Я следовал руководству по настройке до того момента, когда SSO должен начать работать. Когда я открываю свой сайт Discourse в режиме инкогнито, меня сразу перенаправляет на главную страницу WordPress с длинной строкой запроса в URL и без видимых вариантов входа.

Это ожидаемое поведение на данном этапе?
Мне теперь просто нужно завершить настройку стороны WordPress (вход/регистрация и т. д.), или я что-то настроил неправильно?

Привет, Майк, добро пожаловать. Вас должно перенаправить на стандартную страницу входа в WordPress. Первое, что приходит в голову, — это то, что ваша тема (или плагин) предоставляет пользовательскую страницу входа. Как обычно выглядит ваша страница входа?

Привет, Энгус, спасибо! :slight_smile:

Это чистая установка и WordPress, и Discourse с активной темой Twenty Twenty-Five. Я следовал вашим инструкциям из видео шаг за шагом, но при открытии Discourse в режиме инкогнито меня перекидывает на сайт WordPress, и я попадаю на главную страницу темы, а не на экран входа.

Сейчас сайт WordPress закрыт от доступа через настройки приватности каталога, так как он находится в среде разработки. Не может ли это влиять на перенаправление на обычную страницу входа?

Привет, Майк, вот небольшое видео, которое я только что записал, показывающее рабочую установку на текущем коде.

Просто проверь свою настройку по тому, что я показываю в видео, и если ты уверен, что всё настроено так же, но всё ещё не работает, мы пройдёмся методом исключения, чтобы понять, в чём причина.

1 лайк

Привет, Энгус,

Большое спасибо за создание этого видео, отличная поддержка!

Я приложил скриншоты каждого раздела (чувствительная информация размыта)

На последнем скриншоте этот пункт на самом деле не был выбран (ошибка), но когда я открываю форум в режиме инкогнито, он теперь автоматически перенаправляет на /wp-login.php — я не вижу форум и кнопку входа, как вы.

Меня не сильно беспокоит, что сейчас сразу открывается страница wp-login, но прямой доступ к форуму всегда является плюсом!

@angus Я разобрался… В начале, когда я думал «что я делаю», я заблокировал сообщество вот так:

image

Извините, что был таким неудобным, я был в режиме стартапа :dashing_away:.

Ещё раз спасибо за отличную поддержку — уверен, я ещё вернусь.

2 лайка

Рад, что вы разобрались!

Привет, Энгус! Не мог бы ты помочь мне с этой проблемой? Я уже обращался с этим вопросом, но ответа так и не получил:

Суть в том, что когда я анонимизирую пользователя, плагин SSO просто создаёт для него новую учётную запись. Есть ли способ отключать отдельных пользователей, чтобы предотвратить создание новых аккаунтов? И можно ли настроить автоматическую синхронизацию, когда я баню или анонимизирую кого-то?

Можно анонимизировать пользователя, а затем сделать его адрес электронной почты тем, что используется для SSO. Или запретить WordPress доступ этому пользователю (это кажется настоящим решением — WordPress должен отказать пользователю).

Как мне запретить пользователю входить в WordPress через SSO? Я думаю, это решение.

Это вопрос по WordPress. :wink:

Я поискал в интернете, и, похоже, вы можете изменить их роль на «без роли на этом сайте».

Я имел в виду, что пользователь должен иметь возможность продолжать использовать веб-сайт, но не сможет создать аккаунт на форуме.

Наш форум отделен от веб-сайта, поэтому некоторые люди, заблокированные в сообществе за деструктивное поведение, всё ещё должны иметь возможность пользоваться веб-сайтом, который представляет собой SaaS-инструмент.

Тогда, я думаю, вам нужно приостановить их в Discourse. Если вам нужно обезличить их контент, то сначала сделайте это, а затем создайте аккаунт, который будет приостановлен.

Привет, @Shauny, я ответил на ваш первоначальный пост в службу поддержки:

1 лайк