从非WordPress站点移动到WordPress站点-在两个站点之间登录

时间:2020-08-22 作者:Eric Keeler

过去几年我一直在使用一个我自己用PHP编写的网站。该网站旨在创建供人们加入和参与的活动,针对不同的活动具有不同的功能。一些位于主域的子域上,一些位于单独的域上。它们都托管在同一台服务器上,它们的帐户详细信息保存在同一个MySQL数据库中。

我现在正在移动到WooCommerce的WordPress网站,以完成订单和条目,因此所有未来的活动都将在那里进行。我知道用户在第一次使用WooCommerce/WordPress网站时必须创建一个新密码,因为他们的所有详细信息都将保存在一个新的数据库中。现在我仍然有一些我希望保持运行的事件,这些事件不是围绕WordPress站点构建的。

我想要解决的是;

如何为非WP站点创建登录脚本,以便根据WP用户数据库的详细信息登录?我不明白我是如何以与WP相同的方式散列细节并确认其正确性的。我能理解任何可以解释WP使用的哈希的链接吗?

WP和WooCommerce在登录时设置了哪些cookie/会话,以便我可以在非WP网站上搜索它们?如果他们登录主站点,我希望他们不必再次登录旧站点。

我一整天都在寻找答案,但只找到了部分可能存在的小片段。更改WP\\u config中的一些cookie设置以为多个站点设置它们是其中之一。

任何建议都会大有帮助!

埃里克

1 个回复
SO网友:Rup

WordPress验证密码的代码为wp_check_password. 你会发现这个phpass:

require_once ABSPATH . WPINC . \'/class-phpass.php\';
// By default, use the portable hash from phpass.
$wp_hasher = new PasswordHash( 8, true );

$check = $wp_hasher->CheckPassword( $password, $hash );
这是class-phpass.php 在WordPress代码中,乍一看它似乎没有WordPress函数依赖项,您可以只获取整个文件。

请注意,如果WordPress可以使用现有密码,您也可以修改此代码以匹配现有密码:您可以

添加您自己的authenticate 钩子,与默认的wp\\u authenticate\\u username\\u password类似

// Default authentication filters.
add_filter( \'authenticate\', \'wp_authenticate_username_password\', 20, 3 );
这将检查您自己的密码哈希,如果匹配,则返回填充的WP\\u用户对象

钩住check_password 过滤器,在测试哈希后,在wp\\u check\\u password末尾调用:

/**
  * Filters whether the plaintext password matches the encrypted password.
  *
  * @since 2.5.0
  *
  * @param bool       $check    Whether the passwords match.
  * @param string     $password The plaintext password.
  * @param string     $hash     The hashed password.
  * @param string|int $user_id  User ID. Can be empty.
  */
 return apply_filters( \'check_password\', $check, $password, $hash, $user_id );
如果传入的$check值为false,则意味着密码与使用WordPress算法的哈希不匹配:然后可以使用现有逻辑根据哈希测试密码,如果匹配,则返回true。

这样您的用户就可以保留现有密码。如果需要,与现有哈希匹配的代码可以在用户对象中写入一个新样式的哈希,因为它有明确的密码,或者您可以继续匹配现有密码。

唉,检查cookie的代码有点复杂。它是wp_validate_auth_cookie. 如果你坚持到底,你会看到的

cookie被称为wordpress<;哈希值(>);或wordpress\\u sec\\u<;哈希值(>;,根据您是否使用HTTPS,其中哈希部分是站点URL的MD5,它被分为四个管道分隔部分用户名过期日期会话令牌-必须与用户的“会话令牌”wp\\u usermeta中的值匹配经过身份验证的哈希-其他三个组件的MD5-HMAC,加上用户密码散列中的四个字符(这样cookie在密码更改时无效),使用wp config中的AUTH\\u密钥或SECURE\\u AUTH\\u密钥作为HMAC密钥,我怀疑您最好提取WordPress代码的相关部分,而不是尝试重新实现,甚至以某种方式调用WordPress实例。

然而,您可以再次扩展WordPress来接受您现有的Cookie:在这种情况下,您希望挂钩determine_current_user.

相关推荐

Is mature Multisite

我正在运行一个多站点。然而,我希望能够分离某些站点。我看到的唯一选项是“成熟”复选框。我没有运行成熟的网站。我想添加一个“Premium”复选框,但这似乎是不可能的。因此,我将我的Premium博客标记为“成熟”复选框。是否有“Is\\u matured()”类型的函数来确定多站点是否标记为成熟?