问题描述

我即将开始为客户端开发原型,其中一个必需功能是与 in-house 用户验证/注册系统集成。

该系统将作为权威用户数据库,并提供一个用于创建新用户的 RESTful 界面,以及验证有效用户。

  1. 我需要能够在 WP 中创建新用户,作为该过程的一部分,调用外部身份验证 API 来创建/验证该用户。

  2. 作为有效用户但 WP 不知道的人员应该能够登录评论,而不需要在 WP 站点上注册。

  3. 登录整个网站的用户也应该自动登录到 WordPress 。

I’m thinking the following is the way to go.

  • For (1) – is there a registration hook I can use?

  • For (2) – I’m assuming i hook the authenticate filter – ie when someone tries to login, I trap that, make a call to the external system, and then either process the WP login or redirect them to the registration process where (1) takes oer.

  • For (3) – read the login cookie set by the main site and proceed with (2) ?

我想我还需要在用户和 usermeta 表中插入一个记录。

那么,上述是否有意义 – 我没有想过什么。任何人都有很好的资源帮助这个 (@hakre – 我看到你已经完成了一些这方面的工作) 。

Update

所以我仍然在打击我的头,这实际上是我试图钩入验证过滤器,并使用它:

  1. 检查是否设置了’master’ 站点的登录 cookie,如果是,则对其身份验证 API 重新生效,如果有效,则使用主站点 cookie(电子邮件和散列密码) 中包含的信息强制使用 wp_signon()进行 WP 登录 WP 的凭证

  2. 如果未设置 cookie,请重定向到主站点登录页面,并获得登录/注册,然后返回到步骤 1

  3. 如果在认证的主站点用户存在时没有 WP 用户,则创建它,然后创建一个’transparent’ 登录 (即使用户看不到 WP 登录表单)

基本上,我想将 WP 登录表单全部隐藏给那些只是主要评论的用户,后来找到一种允许作者和管理员直接访问的方式。

这是相当慢的,这是我可以使用一些帮助:

  • 验证过滤器是否正确使用?在我期望的所有情况下似乎没有被调用 – 例如,元小工具显示登录/注销链接,而没有验证钩子触发

  • 我可以得到 wp_signon()返回一个 WP_User 对象 (指示成功),但它不影响登录状态 – 即即使刷新后,元小工具仍将显示在”Login” 中。

任何帮助感激之情:)

最佳解决方法

好的,对我有用的方法如下:

  1. 假设主站点用户数据库是权威的。主站点登录 cookie 包含一个 ID 和一个站点密码的哈希值。

  2. 从主站点获取 cookie,并重新对主站点的身份验证 API 进行验证

  3. 如果有效,请使用返回值中的电子邮件地址作为 WP 的'user_login'值,并将散列的站点密码用作 WP 密码。

  4. 使用 wp_authenticate('user_login', 'user_pass')测试该用户是否存在于 WP 中。这将在成功时返回 WP_User 对象,或者在失败时返回 WP_Error 对象。

  5. 如果 WP_Error/is_wp_error(),则使用 wp_update_user()创建一个用户 (或更新一个改变密码的用户) 。

  6. 通过 wp_set_current_user()wp_set_auth_cookie()do_action('wp_login, id)登录

(这全部包含在附加到'init'操作的函数中)

这似乎是有效的 – WP 中未知的有效站点用户将自动创建。密码更改已满足,如果设置了网站 cookie,并且 WP 用户存在,则 SSO 是自动而且无缝的。

次佳解决方法

整个认证系统是可插拔的。我建议您查看现有的插件,了解如何覆盖系统。也许通过看一些 LDAP plugins

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。