在node.js中的WordPress的身份validation

什么是允许用户使用Wordpress页面中的用户帐户使用node.js应用程序的最佳方式?

我曾尝试在Redis中存储会话信息,但是我对PHP不是很熟悉,并且遇到了会话没有被存储的情况。 我已经使用这个指南 。

我也试过使用node-phpass,但是没有很好的logging。 我已经成功连接到Wordpress数据库,但是使用node-phpass生成的密码哈希不匹配wp_users表中的哈希。

这就是我用来testingnode-phpass的东西:

var mysql = require('mysql'); var connection = mysql.createConnection({ host : 'localhost', user : 'wordpress', password : 'jPWrwvGbYXMADd8F', database : 'wordpress', }); connection.query('SELECT * FROM wp_users', function(err, rows) { if (err) { console.log("Database error: " + err); } else { for (var i = 0; i < rows.length; i++){ console.log("Rows[" + i + "] : " + rows[i].user_login + " " + passwordHash.checkPassword('secret',rows[i].user_pass)); } } }); 

除了分享会话,还有其他更好的方法来做到这一点吗? OAuth的?

我不太明白,如果你想让用户主要在你的node.js应用程序上进行身份validation,然后为WordPress创buildcookie,或者相反,但是一旦你了解了WordPress是如何做的,你将能够同时完成。

首先,WordPress使用大量的散列和盐来保护它的cookie,所以你需要知道这些散列和盐的位置能够为nodejs应用程序定义相同的值。

wp-config.php你会发现我们正在寻找的哈希和盐的常量,我想你只需要将你常用的LOGGED_IN_KEYLOGGED_IN_SALTNONCE_KEYNONCE_SALT值传送给你的nodejs应用程序。 你可以更好的看一下文件wp-includes/default-constants.php ,其中WordPress保持其默认常量值,注意if(defined(..)),因为如果常量是在这个之前的其他地方定义的文件(可能在wp-config.php ),值不是来自wp-includes/default-constants.php文件。

现在,您需要了解WordPress如何创buildCookie。 这是login的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上创build身份validationcookie的function驻留在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应用程序以便能够读取和validationcookie也是名字, 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常量,并且使用你想要的WordPresslogincookie名称和肖像就像你的nodejs一样常量,就像这样:

 //WordPress wp-config.php define('LOGGED_IN_COOKIE', 'logged_in_'.'%privateHashKey%'); //NODEJS var LOGGED_IN_COOKIE = 'logged_in_'+'%privateHashKey%'; 

最后你需要将函数wp_generate_auth_cookiewp_hash和hash_hmac映射to your nodejs application if you want to create the cookie there, the first two functions reside on the file wp-inclues / pluggable.php中the hash_hmac resides on wp-包括/ 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函数的function,您还可以解码cookie并在您的nodejs应用程序上validationWordPress用户。

请注意,WordPress为login的cookie值所做的工作就是简单地在用户数据库上对用户的散列密码进行分片,并与cookie的用户login名和到期时间(unix time)进行合并,并一起散列。 然后他使用用户login名,cookie的到期时间和他刚刚创build的哈希来创buildcookie值,前两个值可以用用户的散列密码validation“令牌散列”。

您可能想知道,要注销WordPress用户,您需要在注销url上传递用户的nonce密钥,因此如果您想通过nodejs应用程序从WordPress注销用户,则可能需要传输nonce密钥function。

如果您的应用程序将位于子域中,则可能需要在wp-config.php上声明,否则WordPress将只使用cookie上的完整域名,而Cookie将不可用于子域名。

 define('COOKIE_DOMAIN', '.domain.com'); 

希望这给你更好的方向。 祝你好运。

为了扩展已经给出的答案,有几个node.js库用wordpress通过cookie来validation用户,就像wordpress默认的那样

  1. https://github.com/j3k0/node-wordpress-auth(https://github.com/Nightgunner5/node-wordpress-auth的分支&#xFF09;

  2. https://github.com/jhurliman/node-phpass(https://github.com/rchouinard/phpass的一个端口&#xFF0C; 这是一个相同的库WP正在使用hash密码对node.js)

使用npm install方法安装的wordpress-auth版本已过时。 从模块网站下载并使用该版本。