Вопрос: Аутентификация Wordpress в node.js


Каков наилучший способ позволить пользователю использовать приложение 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?


5


источник


Ответы:


Я не совсем понял, если вы хотите, чтобы пользователь аутентифицировался в первую очередь на вашем приложении 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 fileWP-inclues / pluggable.php thehash_hmac resides onWP-включает / 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');

Надеюсь, это даст вам лучшие направления. Удачи.


2



Чтобы расширить уже предоставленный ответ, существует пара библиотек node.js для аутентификации пользователя с помощью wordpress через файлы cookie, точно так же, как Wordpress делает по умолчанию

  1. https://github.com/j3k0/node-wordpress-auth  (вилка https://github.com/Nightgunner5/node-wordpress-auth )

  2. https://github.com/jhurliman/node-phpass  (порт https://github.com/rchouinard/phpass   которая является той же библиотекой WP, которая использует хэш-пароли , to node.js)


0



Версия wordpress-auth, установленная с использованием метода установки npm, устарела. Загрузите и используйте версию с сайта модулей.


0