Wordpress SSO и вход через Patreon

Привет снова! У меня возник вопрос. Один из моих клиентов хочет постепенно перевести своих участников с Patreon на WordPress (через WooCommerce Memberships). Я знаю, что это возможно, судя по другим темам на форуме.

Однако мой вопрос: если мы включим SSO с WordPress в качестве провайдера, будет ли WordPress единственным способом входа на форум? Перестанет ли включение SSO с WordPress позволять пользователям Patreon входить через свои аккаунты Patreon? Или же возможно запустить оба варианта одновременно?

Извините, если вопрос сформулирован непонятно или я не туда обращаюсь.

Заранее спасибо!

Да, первая буква S в SSO означает Single. WordPress становится авторитетным источником для всей аутентификации.

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

Вы также можете разрешить пользователям входить на ваш сайт WordPress через Patreon с помощью плагина Patreon WordPress – WordPress plugin | WordPress.org. Я не тестировал это, но должно быть возможно разрешить вход в WordPress через Patreon, сохраняя при этом единый вход (SSO) между WordPress и Discourse. Если вы попробуете это и возникнут проблемы с настройкой, пожалуйста, сообщите нам.

Привет! Я протестировал эту настройку, и она в целом работает! :slight_smile:
Единственная проблема, которую я обнаружил, заключается в том, что после успешного входа перенаправление на Discourse не происходит — пользователя возвращает на WordPress. Пользователю приходится вручную переходить на Discourse и снова нажимать кнопку «Войти», чтобы пройти регистрацию. Интересно, можно ли это как-то исправить?

Я записал видео, чтобы показать, как это работает:

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

Интересно, можно ли это исправить, изменив плагин Wordpress-Patreon? Стоит ли связываться с его авторами? :slight_smile:

Если причина проблемы именно в том, что я предполагаю, то модификация плагина WordPress Patreon может её устранить. Скорее всего, проблема в том, что плагин WordPress Patreon удаляет параметры запроса sso и sig, которые передаются вместе с запросом на вход через Patreon. Возможно, стоит связаться с разработчиками этого плагина по поводу данной проблемы.

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

Привет! Я отправил отчет разработчикам плагина Patreon: Redirecting not working when using together with Discourse SSO - Wordpress Plugin - Patreon Developers

Да, я могу это подтвердить:

  • нажатие кнопки «Войти» на Discourse для пользователя, который в данный момент не вошел в WordPress, перенаправляет его на страницу входа в WordPress:white_check_mark: ДА

  • если пользователь затем выбирает вариант входа через Patreon, он входит в WordPress:white_check_mark: ДА

  • но не входит в Discourse:white_check_mark: ДА — на видео выше в момент 0:32 показано, что пользователь не вошел в систему.

Хорошо, я нашёл обходной путь, который «исправляет» проблему с входом через Patreon. Ниже приведены инструкции. :slight_smile:

Вам понадобятся:

  • Любой плагин, предоставляющий шорткод для отображения формы входа (у меня на сайте установлен WooCommerce, поэтому я использовал шорткод [woocommerce_my_account], который делает именно это для неавторизованных пользователей).
  • Плагин Members, который предоставляет шорткоды [members_logged_in] и [members_not_logged_in] для скрытия/отображения контента в зависимости от того, вошёл ли пользователь в систему. Можно использовать любой другой плагин с аналогичной функциональностью шорткодов.
  • Плагин Shortcode Redirect.

Идея состоит в создании специальной страницы, которая отображает форму входа (и кнопку входа через Patreon) для неавторизованных пользователей. Если же пользователь уже вошёл в систему, страница должна перенаправлять его на URL https://community.morevnaproject.org/session/sso?return_path=%2F.
(Очевидно, что вам нужно заменить «community.morevnaproject.org» на свой домен).

Моя специальная страница входа содержит следующее:

[members_not_logged_in]
   [woocommerce_my_account]
   [patreon_login_button]
[/members_not_logged_in]
[members_logged_in]
   [redirect url='https://community.morevnaproject.org/session/sso?return_path=%2F' sec='0']
[/members_logged_in]

(вы можете увидеть это в действии здесь — Log In / Register — Morevna Project)

Затем всё, что нужно сделать, — это настроить плагин WP-Discourse для использования этой страницы в SSO:

Когда пользователь нажимает кнопку «Войти» в Discourse, он перенаправляется на мою специальную страницу WordPress. Поскольку пользователь ещё не авторизован, отображается форма входа. Если пользователь нажимает кнопку «Войти через Patreon», его перенаправляют на Patreon для авторизации. После успешной авторизации он возвращается на мою специальную страницу. Так как пользователь теперь вошёл в систему, срабатывает шорткод «redirect»:

[redirect url='https://community.morevnaproject.org/session/sso?return_path=%2F' sec='0']

…и пользователь успешно перенаправляется обратно на форумы Discourse.

Часть URL session/sso?return_path=%2F в конце обязательна, иначе Discourse не распознает пользователя как авторизованного после перенаправления.

Всё! Надеюсь, это поможет другим пользователям, которые хотят настроить SSO WordPress с входом через Patreon на своём сайте. :slight_smile:

Отличная работа, что разобрались с этим :+1:

Я не хочу умалять вашу работу, но моё первое впечатление таково, что вам стоит рассмотреть использование внешнего сервиса аутентификации (например, okta.com или auth0.com) на данном этапе. Как только возникает необходимость соединять три разных сервиса (например, Patreon, WordPress и Discourse) для единой аутентификации за один шаг, это сигнал о том, что следует задуматься о специализированном решении для аутентификации. Независимо от того, сможете ли вы это реализовать, здесь существует вполне реальный долгосрочный риск того, что ваше решение может дать сбой или не работать во всех случаях.

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

Я быстро ознакомился с кодом плагина Patreon для WordPress, и, похоже, их OAuth-поток принимает пару ключ/значение final_redirect_uri в параметре state, что позволит перейти напрямую от аутентификации Patreon к SSO в Discourse, устраняя необходимость в обоих упомянутых выше плагинах Members и Redirect, а также обходя любые проблемы, которые могут возникнуть при таком подходе.

Многие сервисы аутентификации имеют аналог параметра final_redirect_uri, то есть параметр, позволяющий изменить адрес, куда будет перенаправлен пользователь после аутентификации. Если вы читаете это, потому что пытаетесь решить ту же проблему, но с другим сервисом (то есть не Patreon), и вы также решили, что моё предупреждение о соединении трёх разных сервисов к вам не относится, то именно на это вам стоит обратить внимание.

Это означает, что вам нужен шорткод, генерирующий кнопку входа через Patreon, который бы принимал final_redirect_uri в качестве аргумента, который затем передавался бы в итоговый URL входа, используемый Patreon. Судя по коду плагина Patreon для WordPress, это вполне реализуемо. Для наглядности: соответствующая функция, генерирующая URL Patreon, выглядит так:

Patreon_Frontend::patreonMakeLoginLink(false, array( 'final_redirect_uri' => # ) );

По сути, код уже частично настроен для обработки пользовательского final_redirect_uri. Я понимаю, почему разработчики плагина Patreon для WordPress могли не захотеть добавлять эту возможность, но если вы чувствуете себя достаточно уверенно, чтобы описать то, что я изложил выше, возможно, стоит создать запрос (issue) в их репозитории на GitHub. Если это не сработает, вы можете использовать указанную выше функцию для генерации ссылки самостоятельно и создать свою кнопку (или нанять разработчика WordPress для этого).

Небольшое замечание по поводу построения URL SSO: немного понятнее использовать

https://discourse.example.com/session/sso?return_path=/

вместо

https://discourse.example.com/session/sso?return_path=%2F

Последняя часть, return_path, — это путь, на который пользователь будет перенаправлен в Discourse после входа. Если это /, его отправят на главную страницу форума. Подробнее о построении URL SSO см. в WP Discourse Tips and Tricks.

+1, да, риск есть! :slight_smile:

Вау, огромное спасибо за подробные инструкции! Понятно, что нужно изменить шорткод [patreon_login_button], чтобы он принимал параметр final_redirect_uri, и отправить pull request в их репозиторий на GitHub. Ещё раз спасибо, что нашли время всё объяснить!