alr*_*ken 5 php wordpress node.js
允许用户使用Wordpress页面中的用户帐户使用node.js应用程序的最佳方法是什么?
我已经尝试在Redis中存储会话信息,但我对PHP不是很熟悉并且遇到了没有存储会话的死胡同.我使用过本指南.
我也尝试过使用node-phpass,但它没有很好的记录.我已成功连接到Wordpress数据库,但我使用node-phpass生成的密码哈希值与wp_users表中的哈希值不匹配.
这就是我用来测试node-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));
}
}
});
Run Code Online (Sandbox Code Playgroud)
除了分享会话,还有其他更好的方法吗?OAuth的?
我不太明白您是否希望用户主要在您的 node.js 应用程序上进行身份验证,然后为 WordPress 创建 cookie,或者相反,但是一旦您了解 WordPress 是如何做到这一点的,您将能够完成这两个任务。
首先,WordPress 使用大量哈希值和盐来保护其 cookie,因此您需要知道这些哈希值和盐在哪里,以便能够为您的 Nodejs 应用程序上的值定义相同的值。
您将wp-config.php找到我们正在寻找的哈希值和盐的常量,我认为您只需将LOGGED_IN_KEY、LOGGED_IN_SALT和NONCE_KEY的常量值传输到您的nodejs应用程序即可NONCE_SALT。您可能会更好地查看wp-includes/default-constants.phpWordPress 保留其默认常量值的文件,请注意 if(define(..)) 因为如果该常量在此文件之前的其他位置定义(可能在wp-config.php),则该值将来自那个而不是来自wp-includes/default-constants.php文件。
现在,您需要了解 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%
Run Code Online (Sandbox Code Playgroud)
你需要让你的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);
Run Code Online (Sandbox Code Playgroud)
请注意,该常量LOGGED_IN_COOKIE默认设置为wp-includes/default-constants.php,在您拥有常量的同一个文件上COOKIEHASH,您需要将其值传输到您的 Nodejs 应用程序,以便能够读取和验证 cookie 名称,这COOKIEHASH只是用哈希值哈希的网站 URL md5。
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);
Run Code Online (Sandbox Code Playgroud)
如果你不想传输所有这些,你可以在 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%';
Run Code Online (Sandbox Code Playgroud)
最后,您需要描绘函数wp_generate_auth_cookie和wp_hashhash_hmac to your nodejs application if you want to create the cookie there, the first two functions reside on the filewp-inclues/pluggable.php thehash_hmac resides onwp-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;
Run Code Online (Sandbox Code Playgroud)
一旦您了解了wp_generate_auth_cookie函数的作用,您还可以解码 cookie 并在您的 Nodejs 应用程序上对 WordPress 用户进行身份验证。
请注意,WordPress 对登录的 cookie 值所做的只是在数据库中分割用户的散列密码,与用户登录名和 cookie 的过期时间(unix 时间)合并,然后将所有内容散列在一起。然后,他使用用户登录名、cookie 的过期时间和他刚刚创建的哈希值创建 cookie 值,通过前两个值,他可以使用用户的哈希密码验证“令牌哈希值”。
您可能想知道,要在 WordPress 上注销用户,您需要在注销 url 上传递用户的随机数密钥,因此,如果您想通过 Nodejs 应用程序从 WordPress 注销用户,您可能需要传输随机数密钥功能。
如果您的应用程序位于子域中,您可能需要声明 on wp-config.php,否则 WordPress 将仅使用 cookie 上的完整域,并且 cookie 将不可用于子域。
define('COOKIE_DOMAIN', '.domain.com');
Run Code Online (Sandbox Code Playgroud)
希望这能给您更好的指导。祝你好运。
| 归档时间: |
|
| 查看次数: |
2468 次 |
| 最近记录: |