长期以来,我们一直使用 Discourse 的 Patreon 插件和 API V1 来通过 Patreon 登录。这是官方 Discourse Patreon 插件文档推荐的设置:https://meta.discourse.org/t/configure-patreon-integration-with-discourse/62380

然而,Patreon 多年不再支持 V1。它经常出问题,无法完全同步,最近更是完全无法使用。
问题在于,当我们切换到 Patreon 支持的 API V2 时,它无法授权用户。当用户尝试点击“使用 Patreon 登录”并允许 API v2 连接到他们的 Patreon 账户时,他们会收到此错误:
对不起,在尝试通过 Patreon 授权您的帐户时出错。请重试。
根据官方 Patreon 插件 Discourse 文档,明确指出 API v2 可能会导致这些身份验证错误。这使得 v2 无法使用。

值得庆幸的是,我们找到了一个解决方法来让 API v2 正常工作。这个解决方案应该添加到官方文档中,因为目前推荐的 API v1 完全失效了。
解决方案
解决方案是创建一个自定义 OAuth2。用户将不使用 Patreon 插件的“使用 Patreon 登录”按钮,而是使用我们创建的自定义登录按钮,该按钮将使用我们自己的 OAuth 与 Patreon 进行身份验证。
步骤 1:将以下重定向 URI 添加到 Patreon。
-
https://<your_discourse_server_link>/auth/oauth2_basic/callback -
https://<your_discourse_server_link>/auth/patreon/callback
步骤 2:在 Discourse 中转到“管理”>“登录与身份验证”>“OAuth2”并进行以下配置:
-
oauth2_enabled:true -
oauth2_client_id:<your Patreon client id> -
oauth2_client_secret:<your Patreon client secret> -
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 (信任提供商以减少提示) 如果某些赞助者缺少电子邮件,请将其设置为 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:在您的 Discourse yml 文件中为网络和主机进行以下配置。
-
DISCOURSE_HOSTNAME在app.yml中:<your_discourse_server_link> -
force_https:true
步骤 5:重建您的应用程序以实施更改:
cd /var/discourse
./launcher rebuild app
结果:
现在您应该拥有自己的有效的 OAuth2“使用 Patreon 登录”按钮,该按钮在 API v2 上正常工作,并能正确地将您的用户组与 Patreon 同步。