WordPress Multisite с несколькими экземплярами Discourse

Всем привет,

Меня интересует информация о возможности добавления ещё одного сообщества Discourse в нашу текущую инфраструктуру. На данный момент у нас настроен WordPress Multisite с одним сообществом Discourse, использующим SSO Discourse для сайта, посвящённого этому сообществу, при этом вход в WP обеспечивается другим провайдером SSO.

Я планирую добавить новый сайт WP для нового сообщества Discourse, но не уверен, можно ли объединить несколько форумов Discourse в рамках этой настройки Multisite (если это имеет смысл). Поскольку SSO настроен на уровне сети WP, кажется, что невозможно иметь более одного экземпляра Discourse.

В идеале мы хотели бы иметь:

  • WordPress Multisite
  • 2 экземпляра Discourse

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

Я читал некоторые посты о настройке Multisite WP с одиночным экземпляром Discourse (и наоборот), но не нашёл информации о Multisite WP с несколькими экземплярами Discourse.

Спасибо

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

Спасибо — я так и предполагал. Возможно ли настроить так, чтобы один экземпляр Discourse выступал провайдером SSO для другого, сохраняя при этом корректный доступ пользователей к их соответствующим сообществам?

Инстанция Discourse может функционировать в качестве провайдера SSO для другой инстанций Discourse. Я предполагаю, что рассматриваемая вами схема предполагает использование WordPress в качестве провайдера SSO для первой инстанций Discourse, а первой инстанций — в качестве провайдера SSO для второй инстанций Discourse. Думаю, это возможно, но я никогда не настраивал сайт Discourse одновременно и как клиент SSO, и как провайдер SSO.

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

Другой возможный подход к решению проблемы — использовать одну инстанцию Discourse и ограничивать доступ пользователей к определенным разделам форума с помощью прав доступа к категориям и группам. В полезную нагрузку SSO можно передавать группы Discourse. На вашем сайте WordPress должно быть возможно определить, к каким сайтам у пользователя есть доступ. Вы можете создать группу Discourse для каждого сайта WordPress, а затем использовать фильтр wpdc_sso_params, чтобы добавить параметр add_groups в полезную нагрузку SSO.

В настоящее время провайдером SSO является сам Discourse — полагаю, что (новая) задача заключается в том, чтобы сделать экземпляр 1 провайдером SSO (для обоих экземпляров 1 и 2).

По сути, сохранить текущую настройку SSO, но добавить ещё один экземпляр Discourse и при этом найти способ ограничить доступ между экземпляром 1 и экземпляром 2.

Привет, @simon! Сейчас внедряю это и не понимаю, почему в плагине WP Discourse не отображаются опции SSO-клиента. См. скриншот ниже:

Мое подключение показывает, что оно активно (об этом же говорит и время последнего использования API-ключа). При добавлении шорткода [discourse_sso_client] возникает проблема с конфигурацией: заголовок ответа location содержит URL, сгенерированный шорткодом [discourse_sso_client], вместо полезной нагрузки SSO.

Это сделано намеренно. Опция SSO Client доступна только в мультисайтовых сетях, если она настроена на уровне всего сайта. Мне нужно настроить мультисайтовую сеть в моей локальной среде разработки, чтобы ещё раз проверить настройки. Я вернусь к вам с ответом сегодня позже.

Спасибо — сейчас у меня плагин установлен на уровне сети с выбранным SSO Client.

редактирование: Я отладил проблему до query-redirect.php здесь:

if ( empty( $this->options['sso-client-enabled'] ) || 1 !== intval( $this->options['sso-client-enabled'] ) ) {
   return;
}

Похоже, что эта опция для меня не устанавливается корректно — не уверен, связано ли это с настройкой на уровне сети или чем-то другим.

Документация по настройке плагина в сети нескольких сайтов устарела. Это отличный повод привести её в порядок и обновить руководство по установке и настройке плагина WP Discourse.

Чтобы использовать функциональность SSO-клиента в сети нескольких сайтов, плагин необходимо настроить на уровне сети. Для этого нажмите ссылку Discourse на панели управления сетью:

На странице сети Discourse выберите опцию «Включить конфигурацию для сети нескольких сайтов» (Enable Multisite Configuration). Затем в разделе «Настройки подключения» (Connection Settings) введите URL вашего сайта Discourse, API-ключ и имя пользователя для публикации. Прокрутите страницу вниз и нажмите кнопку «Сохранить параметры» (Save Options). В верхней части страницы должно появиться сообщение «Вы подключены к Discourse!» (You are connected to Discourse!).

Чтобы использовать Discourse в качестве провайдера SSO для сайтов вашей сети, прокрутите страницу сети Discourse вниз и выберите опцию «Включить SSO-клиент» (Enable SSO Client). Также добавьте ключ в поле «Секретный ключ SSO» (SSO Secret Key). Снова сохраните параметры.

Теперь перейдите на свой сайт Discourse и скопируйте секретный ключ в настройку сайта Discourse sso provider secrets. В качестве домена провайдера SSO введите символ *. После сохранения настройка должна выглядеть примерно так:

Теперь на Discourse выберите опцию enable sso provider.

При наличии этих настроек переход на вкладку SSO / SSO Client плагина WP Discourse для любого сайта вашей сети должен открыть страницу, похожую на эту:

Для быстрой проверки выберите опции «Добавить ссылку для входа» (Add Login Link) и «Синхронизировать существующих пользователей по электронной почте» (Sync Existing Users by Email). Затем выйдите из системы на сайте WordPress. Вы должны иметь возможность войти снова, нажав на ссылку «Войти через Discourse» (Login with Discourse), которая будет отображаться на странице wp-login.php.

Если вы не используете страницу входа WordPress по умолчанию, попробуйте добавить шорткод [discourse_sso_client] в запись на вашем сайте. Этот шорткод отображает разметку на странице только для неавторизованных пользователей. Вы также можете создать ссылку для входа, используя следующий формат:

<a href="https://example.com/?discourse_sso=1&redirect_to=https://example.comt/">Log in with Discourse</a>

Это выполнит вход пользователя в ваш сайт через Discourse, а затем перенаправит его обратно на страницу WordPress, указанную в значении параметра redirect_to.

Судя по вашему анализу, опция «Включить SSO-клиент» (Enable SSO Client) на странице сети Discourse не была активирована. Убедитесь, что эта опция включена, и сообщите, если у вас всё ещё возникают проблемы.

Код, который вы обнаружили и который препятствовал работе SSO-клиента, верен, но условие написано некорректно:

if ( empty( $this->options['sso-client-enabled'] ) || 1 !== intval( $this->options['sso-client-enabled'] ) )

Его следует упростить до if ( empty( $this->options['sso-client-enabled'] ) ). Именно такой паттерн используется во всех остальных местах плагина.