Долгое время мы использовали плагин Patreon с API V1 для входа в Discourse через Patreon. Это рекомендуемая настройка согласно официальной документации плагина Patreon для Discourse: Configure Patreon integration with Discourse

Однако Patreon не поддерживает V1 уже несколько лет. Он постоянно ломается, не обеспечивает полную синхронизацию, и недавно он просто перестал работать у нас.
Проблема в том, что при переключении на поддерживаемую Patreon версию API V2 авторизация пользователей не удаётся. Когда пользователи нажимают «Войти через Patreon» и разрешают API v2 подключиться к их аккаунту Patreon, они получают эту ошибку:
Извините, произошла ошибка при попытке авторизовать ваш аккаунт в Patreon. Пожалуйста, попробуйте снова.
Согласно официальной документации плагина Patreon для Discourse, именно использование API v2 может вызывать такие ошибки аутентификации. Это делает v2 непригодным для использования.
К счастью, мы нашли обходной путь, чтобы заставить API v2 работать. Это решение должно быть добавлено в официальную документацию, поскольку в настоящее время API v1, который рекомендуется, полностью неработоспособен.
Решение
Решение заключается в создании кастомной OAuth2-аутентификации. Вместо того чтобы пользователи использовали кнопку «Войти через Patreon» из плагина Patreon, они будут использовать нашу собственную кнопку входа, которая будет выполнять аутентификацию через Patreon с использованием нашего собственного OAuth.
Шаг 1: Добавьте следующие URI перенаправления в Patreon.
Шаг 2: В Discourse перейдите в Администрирование > Вход и аутентификация > OAuth2 и настройте следующие параметры:
-
oauth2_enabled: true
-
oauth2_client_id: <ваш client_id Patreon>
-
oauth2_client_secret: <ваш client_secret Patreon>
-
oauth2_authorize_url: https://www.patreon.com/oauth2/authorize
-
oauth2_authorize_signup_url: (оставьте пустым)
-
oauth2_token_url: https://www.patreon.com/api/oauth2/token
-
oauth2_callback_user_id_path: (оставьте пустым)
-
oauth2_callback_user_info_paths: email
-
oauth2_token_url_method: POST
-
oauth2_callback_user_info_paths: email
-
oauth2_fetch_user_details: true
-
oauth2_user_json_url: https://www.patreon.com/api/oauth2/v2/identity?include=memberships&fields[user]=email,full_name,vanity
-
oauth2_json_user_id_path: data.id
-
oauth2_json_name_path: data.attributes.full_name
-
oauth2_json_username_path: data.attributes.vanity
-
oauth2_json_email_path: data.attributes.email
-
oauth2_json_email_verified_path: (оставьте пустым)
-
oauth2_email_verified: true (доверяйте провайдеру, чтобы уменьшить количество запросов). Если у некоторых патронов нет email, установите это значение в false и ожидайте запроса на регистрацию.
-
oauth2_email_verified: true
-
oauth2_send_auth_header: true
-
oauth2_send_auth_body: true
-
oauth2_debug_auth: true
-
oauth2_authorize_options: scope
-
oauth2_scope: identity identity[email] campaigns campaigns.members
-
oauth2_button_title: Войти через Patreon
-
oauth2_allow_association_change: false (рекомендуется)
Шаг 3: В основных настройках входа Discourse настройте следующее:
-
enable sso: false
-
patreon login enabled: false (предотвращает появление двух кнопок Patreon; оставляйте плагин только для синхронизации)
-
allow new registrations: выберите:
-
true, чтобы новые патроны могли создавать аккаунты
-
false, чтобы разрешить вход только существующим пользователям Discourse
-
invite only: false во время тестирования
-
must approve users: false во время тестирования
-
session_cookie_domain: (пусто)
Шаг 4: В вашем файле yml Discourse настройте следующие параметры для сети и хостов.
Шаг 5: Пересоберите приложение, чтобы применить изменения:
cd /var/discourse
./launcher rebuild app
Результат:
Теперь у вас должна быть собственная рабочая кнопка входа через OAuth2 с Patreon, которая действительно работает с API v2 и правильно синхронизирует ваши группы пользователей с Patreon.