Отличная работа, что разобрались с этим ![]()
Я не хочу умалять вашу работу, но моё первое впечатление таково, что вам стоит рассмотреть использование внешнего сервиса аутентификации (например, 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.