Каков наилучший способ позволить пользователю использовать приложение node.js, используя свою учетную запись пользователя на странице Wordpress?
Я попытался сохранить информацию о сеансе в Redis, но я не очень хорошо знаком с PHP и столкнулся с тупиком, где сеанс не сохраняется. Я использовал это руководство ,
Я также попытался использовать Узел-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));
}
}
});
Помимо совместного использования сеанса, есть ли еще какие-либо другие способы сделать это? OAuth?
Я не совсем понял, если вы хотите, чтобы пользователь аутентифицировался в первую очередь на вашем приложении node.js, а затем создал файл cookie для WordPress или наоборот, но как только вы поймете, как это делает WordPress, вы сможете выполнить оба ,
Прежде всего, WordPress использует большое количество хэшей и солей для защиты своих файлов cookie, поэтому вам нужно знать, где эти хеши и соли должны быть способны определять те же значения для тех, кто находится в вашем приложении nodejs.
На wp-config.php
вы найдете константы хешей и солей, которые мы ищем, я думаю, вам просто нужно передать в приложение nodejs постоянные значения для LOGGED_IN_KEY
, LOGGED_IN_SALT
, NONCE_KEY
а также NONCE_SALT
, Вы можете лучше просмотреть файл wp-includes/default-constants.php
где WordPress сохраняет свои постоянные значения по умолчанию, обратите внимание на if (определено (..)), потому что если константа определена где-то еще до этого файла (вероятно, на 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%
Вам нужно, чтобы ваше приложение nodejs понимало этот файл cookie, будучи в состоянии разбить его так же, как WordPress.
Функции создания файлов cookie для проверки подлинности в WordPress 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
constant, вам нужно передать значение этого приложения в приложение 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);
если вы не хотите переносить все это, вы можете просто установить на wp-config.php LOGGED_IN_COOKIE
константа с зарегистрированным именем cookie, которое вы хотите для WordPress, и портретом именно этой константы для ваших 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_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
функция, вы также сможете декодировать файл cookie и аутентифицировать пользователя WordPress в приложении nodejs.
Обратите внимание, что то, что WordPress делает для зарегистрированного значения cookie, просто нарезает хешированный пароль для пользователя в вашей базе данных, сливаясь с именем пользователя и временем истечения времени (unix time) для файла cookie и все хеширование. Затем он создает значение cookie с именем пользователя, временем истечения для cookie и хешем, который он только что создал, причем первые два значения он может проверить «хэш-токен» с хешированным паролем от пользователя.
Возможно, вам захочется узнать, что для выхода из системы в WordPress вам необходимо передать ключ nonce для пользователя на URL-адрес выхода, поэтому, если вы хотите выйти из WordPress с помощью приложения nodejs, вам может понадобиться передать ключ nonce функции.
Если ваше приложение будет находиться в субдомене, вы можете захотеть объявить его wp-config.php
, или WordPress просто будет использовать полный домен в файле cookie, и cookie будет недоступен для поддоменов.
define('COOKIE_DOMAIN', '.domain.com');
Надеюсь, это даст вам лучшие направления. Удачи.