再次你好!我有个问题。我的客户希望逐步将其会员体系从 Patreon 迁移到 WordPress(通过 WooCommerce Memberships)。根据其他论坛帖子的信息,我知道这是可行的。
不过,我的问题是:如果我们启用以 WordPress 为提供者的单点登录(SSO),那么 WordPress 是否将成为登录论坛的唯一方式?启用与 WordPress 的 SSO 后,Patreon 用户是否就无法再通过其 Patreon 账户登录了?还是说,两者可以并存运行?
如果这个问题令人困惑或发错了地方,敬请见谅。
提前感谢!
Stephen
(Stephen)
2
是的,SSO 中的第一个 S 代表 Single(单一)。WordPress 将成为所有身份验证的权威来源。
不过,如果 Patreon 提供了用户的电子邮件地址,用户可以使用相同的地址在 WordPress 上注册,从而重新访问他们的账户。
simon
3
您还可以让用户通过 Patreon 登录您的 WordPress 站点,插件地址为 Patreon WordPress – WordPress plugin | WordPress.org Patreon 登录 WordPress 的同时,实现 WordPress 与 Discourse 之间的单点登录(SSO)。如果您尝试后遇到任何问题,请随时告诉我们。
你好!我测试了这个设置,基本上可以正常工作!
我发现的唯一问题是,成功登录后它不会重定向到 Discourse,而是将用户返回到 WordPress。用户必须手动前往 Discourse,然后再次点击“登录”按钮才能完成注册。不知道这个问题能否通过某种方式修复?
我录制了一段视频来展示其工作方式:
simon
5
感谢你进行尝试。听起来在 Patreon 登录过程中,登录 Discourse 所需的 SSO 参数被移除了。如果是这种情况,可能无法修复该问题。
我想知道,能否通过修改 WordPress-Patreon 插件来解决这个问题?值得联系其作者吗?
simon
7
如果问题的根源正如我所想,那么修改 WordPress Patreon 插件或许可以解决该问题。我认为导致问题的原因是,WordPress Patreon 插件剥离了 Patreon 登录请求中附带的 sso 和 sig 查询参数。建议就该问题联系该插件的开发者。
在这样做之前,您应确认:对于尚未登录 WordPress 的用户,点击 Discourse 上的“登录”按钮是否会将其引导至 WordPress 登录页面。如果该用户随后选择 Patreon 登录选项,他们会被登录到 WordPress,但并未登录到 Discourse。请注意,如果您的 Discourse 站点设置为私有模式,用户直接访问您的 Discourse 站点时也会出现上述情况。在这种情况下,用户在 Discourse 上将看不到“登录”按钮。
你好!我已向 Patreon 插件开发者提交了报告:Redirecting not working when using together with Discourse SSO - Wordpress Plugin - Patreon Developers
是的,我可以确认:
- 点击 Discourse 上的“登录”按钮,对于当前未登录 WordPress 的用户会将其引导至 WordPress 登录页面 -
是
- 如果用户随后选择 Patreon 登录选项,他们将登录到 WordPress -
是
- 但不会登录到 Discourse -
是 - 在 上方视频的 0:32 处 显示用户并未登录。
好的,我已经找到了一个变通方法,可以“修复”Patreon 登录的问题。具体操作说明如下。
你需要准备:
- 任意一个提供用于显示登录表单的短代码的插件(我的网站上安装了 WooCommerce,所以我使用了
[woocommerce_my_account] 短代码,它正好能为未登录用户显示登录表单)。
- Members 插件,它提供
[members_logged_in] 和 [members_not_logged_in] 短代码,可根据用户是否登录来隐藏或显示内容。你也可以使用其他提供类似短代码功能的插件。
- Shortcode Redirect 插件。
思路是创建一个特殊页面,该页面在未登录用户访问时显示登录表单(以及 Patreon 登录按钮)。如果用户已登录,则将其重定向到 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]
(你可以在这里看到实际效果:https://morevnaproject.org/log-in-discourse/)
接下来,只需配置 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 在重定向后将无法识别用户已登录。
就是这样!希望这能帮助其他希望在网站上实现 WordPress SSO 并集成 Patreon 登录的用户。
angus
(Angus McLeod)
10
干得漂亮,能想到这一步 
我不想贬低你已经完成的工作,但我初步的看法是,你现在应该考虑使用外部认证服务(例如 okta.com 或 auth0.com)。当你需要连接三个不同的服务(例如 Patreon、WordPress 和 Discourse)来实现一次性统一认证时,这就表明你应该考虑采用专门的认证解决方案。无论你是否能以某种方式实现,这里都存在相当大的长尾风险:你的解决方案可能会失效,或者无法在所有情况下正常工作。
如果你仍然想走这条路,我有一些建议,但事先声明,接下来会涉及一些技术细节。我之所以把这些写在这里,部分原因是希望其他遇到同样问题并希望进一步探索的人也能看到。
我快速查看了一下 Patreon WordPress 插件代码,发现他们的 OAuth 流程在 state 参数中接受一个 final_redirect_uri 键值对。这将允许你直接从 Patreon 认证跳转到 Discourse SSO,从而无需上述的 Members 和 Redirect 插件,并避免该方案可能引发的任何问题。
许多认证服务都有类似 final_redirect_uri 的参数,即允许你更改用户认证后被重定向到的位置。如果你是因为试图解决相同问题(但使用的是其他服务,而非 Patreon)而阅读此内容,并且你也认为我关于“不要连接三个不同服务”的警告不适用于你的情况,那么你应该去查找这类参数。
这意味着你需要让生成 Patreon 登录按钮的短代码接受 final_redirect_uri 作为参数,然后将其传递给 Patreon 最终使用的登录 URL。查看 Patreon WordPress 插件代码,这完全是可行的。为了让你有个概念,生成 Patreon URL 的相关函数大致如下:
Patreon_Frontend::patreonMakeLoginLink(false, array( 'final_redirect_uri' => # ) );
基本上,代码已经部分配置好以处理自定义的 final_redirect_uri。我能理解 Patreon WordPress 插件的开发者可能不想添加此功能,但如果你觉得自己有能力清晰描述我上面所说的内容,那么在他们 GitHub 仓库 上提一个 issue 可能是值得的。如果不行,你可以使用我上面提到的那个函数自己生成链接并创建按钮(或者聘请一位 WordPress 开发者来帮你做)。
关于 SSO URL 的构建,这里有个小建议:使用以下格式会更清晰:
https://discourse.example.com/session/sso?return_path=/
而不是:
https://discourse.example.com/session/sso?return_path=%2F
最后那部分 return_path 是用户登录后在 Discourse 中被重定向到的路径。如果是 /,他们将被送往论坛首页。有关 SSO URL 构建的更多信息,请参阅 WP Discourse 技巧与窍门。
+1 是的,确实有风险!
哇,非常感谢你提供这么详细的说明!所以,修改 [patreon_login_button] 短代码以接受 final_redirect_uri 参数,并向他们的 GitHub 仓库提交 PR,这个思路是合理的。再次感谢你抽出时间解释!