我不太明白您是否希望用户主要在您的 node.js 应用程序上进行身份验证,然后为 WordPress 创建 cookie,或者相反,但是一旦您了解 WordPress 是如何做到这一点的,您将能够完成这两个任务。
首先,WordPress 使用大量哈希值和盐来保护其 cookie,因此您需要知道这些哈希值和盐在哪里,以便能够为 Nodejs 应用程序上的值定义相同的值。
On wp-config.php
你会找到我们正在寻找的哈希值和盐的常量,我认为你只需要将常量值传输到你的nodejs应用程序LOGGED_IN_KEY
, LOGGED_IN_SALT
, NONCE_KEY
and NONCE_SALT
。您可以更好地查看该文件wp-includes/default-constants.php
WordPress 保留其默认常量值,请注意 if(define(..)),因为如果该常量是在该文件之前的其他地方定义的(可能在wp-config.php
)该值将来自该值,而不是来自wp-includes/default-constants.php
file.
现在,您需要了解 WordPress 如何创建 cookie。
这是登录 cookie 的示例:
Cookie Name: wordpress_logged_in_2801795354f6f1c2d2ab3b48033a8257
Cookie Value: admin|1392386298|647852d61caf4cfdea975d54ecb09ca8
Cookie Value: %user_login%|%cookie_expire_time%|%hashed_sliced_user_hashed_password%
你需要让你的nodejs应用程序理解这个cookie,能够像WordPress一样破坏它。
在 WordPress 上创建身份验证 cookie 的函数位于wp-includes/pluggable.php
$logged_in_cookie = wp_generate_auth_cookie($user_id, $expiration, 'logged_in');
//...
setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);
注意常数LOGGED_IN_COOKIE
默认设置为wp-includes/default-constants.php
,在同一个文件中,您有COOKIEHASH
常量,您需要将其值传输到您的nodejs应用程序,以便能够读取和验证cookie名称,COOKIEHASH
只是使用 md5 散列的网站 URL。
if ( !defined( 'COOKIEHASH' ) ) {
$siteurl = get_site_option( 'siteurl' );
if ( $siteurl )
define( 'COOKIEHASH', md5( $siteurl ) );
else
define( 'COOKIEHASH', '' );
}
//...
define('LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH);
如果你不想传输所有这些,你可以在 wp-config.php 上设置LOGGED_IN_COOKIE
常量包含您想要用于 WordPress 的登录 cookie 名称,并将此常量添加到您的 Nodejs 中,如下所示:
//WordPress wp-config.php
define('LOGGED_IN_COOKIE', 'logged_in_'.'%privateHashKey%');
//NODEJS
var LOGGED_IN_COOKIE = 'logged_in_'+'%privateHashKey%';
最后你需要描绘出功能wp_generate_auth_cookie
, wp_hash
和 hash_hmacto your nodejs application if you want to create the cookie there, the first two functions reside on the file
wp-includes/pluggable.phpthe
哈希_hmacresides on
wp-includes/compat.php`。
if ( !function_exists('wp_generate_auth_cookie') ) :
//...
function wp_generate_auth_cookie($user_id, $expiration, $scheme = 'auth') {
$user = get_userdata($user_id);
$pass_frag = substr($user->user_pass, 8, 4);
$key = wp_hash($user->user_login . $pass_frag . '|' . $expiration, $scheme);
$hash = hash_hmac('md5', $user->user_login . '|' . $expiration, $key);
$cookie = $user->user_login . '|' . $expiration . '|' . $hash;
return apply_filters('auth_cookie', $cookie, $user_id, $expiration, $scheme);
}
endif;
一旦你明白了什么wp_generate_auth_cookie
函数正在执行,您还可以解码 cookie 并在您的 Nodejs 应用程序上对 WordPress 用户进行身份验证。
请注意,WordPress 对登录的 cookie 值所做的只是在数据库中分割用户的散列密码,与用户登录名和 cookie 的过期时间(unix 时间)合并,然后将所有内容散列在一起。然后,他使用用户登录名、cookie 的过期时间和他刚刚创建的哈希值创建 cookie 值,通过前两个值,他可以使用用户的哈希密码验证“令牌哈希值”。
您可能想知道,要在 WordPress 上注销用户,您需要在注销 url 上传递用户的随机数密钥,因此,如果您想通过 Nodejs 应用程序从 WordPress 注销用户,您可能需要传输随机数密钥功能。
如果您的应用程序位于子域中,您可能需要声明wp-config.php
,否则 WordPress 将仅使用 cookie 上的完整域,并且 cookie 将不可用于子域。
define('COOKIE_DOMAIN', '.domain.com');
希望这能给您更好的指导。祝你好运。