Подключиться ко всем сбросам пароля в WordPress и получить пароль до хеширования?

Вопрос или проблема

Я синхронизирую мою систему аутентификации WordPress с дополнительной/внешней системой аутентификации, и на моем сайте есть как минимум два способа сброса пароля, включая:

  1. Электронное письмо для сброса пароля
  2. Сброс пароля на экране учетной записи пользователя

Возможно, есть и третий способ, который я не помню, так как до сих пор я запрещал сброс паролей из-за невозможности синхронизации систем.

Суть моего вопроса: Как я могу подключиться к процессу сброса пароля до его хеширования, чтобы я мог одновременно установить новый пароль в дополнительной/внешней системе аутентификации?


Необязательная дополнительная информация:

  • Пользователь сбрасывает пароль, используя письмо для сброса пароля, а не авто-сгенерированный
  • Экран учетной записи пользователя – это не панель управления WordPress, а реализация через плагин

Эти две системы используют разные механизмы хеширования, поэтому подключение после хеширования не поможет. Знаю, это неудобно, но это все, что у меня есть.

Я вижу способы, как, возможно, сделать это для каждого метода, но это было бы довольно утомительно поддерживать, так как платформа растет.

Используйте password_reset хук.

function wpse_password_reset( $user, $new_pass ) {
  //* Делайте что-то полезное с $new_pass
}
add_action( 'password_reset', 'wpse_password_reset', 10, 2 );

Отредактировано для добавления после комментария:

Похоже, причина, по которой я не могу это использовать, в том, что плагин использует wp_update_user для установки нового пароля. Есть ли способ перехватить пароль до этого?

Да. Вы можете использовать фильтр send_password_change_email.

function wpse_send_password_change_email( $true, $user, $userdata ) {
  //* Делайте что-то полезное с новым паролем
  wp_die(
    sprintf(
      '%1$s изменил(а) свой пароль на %2$s.',
      $userdata[ 'user_login' ],
      $_POST[ 'pass1' ]
    )
  );

  //* Нужно вернуть $true, так как это фильтр
  return $true;
}
add_filter( 'send_password_change_email', 'wpse_send_password_change_email', 10, 3 );

Ответ или решение

Ваша задача связана с синхронизацией системы аутентификации WordPress с внешней системой, требующей перехвата паролей до их хеширования. В таких ситуациях необходимо понимать особенности работы WordPress и доступные возможности его API.

1. Контекст проблемы

Вы управляете системой, где пользователи могут сбросить пароли несколькими способами, включая:

  • Сброс пароля через электронную почту.
  • Сброс пароля через экран учетной записи (не встроенная панель WordPress, а через плагин).

Вам важно получить доступ к новому паролю до его хеширования, чтобы синхронизировать его с внешней системой, используемой другими методами хеширования.

2. Предложенное решение

Для решения данной задачи можно использовать хуки WordPress, которые позволяют выполнять пользовательский код до и после ключевых событий.

Используйте хук для пароля до хеширования

Одним из возможных решений является перехват данных формы до их обработки WordPress. Однако в вашем случае вы уже знаете, что хук password_reset не подходит, так как плагин использует функцию wp_update_user, а не стандартный процесс сброса пароля.

Альтернативное решение через send_password_change_email

Вы можете использовать фильтр send_password_change_email, чтобы получить доступ к паролю до его изменения. Этот подход позволяет обработать данные и отправить новый пароль во внешнюю систему. Пример:

function wpse_send_password_change_email( $send, $user, $userdata ) {
    $new_password = $_POST['pass1'];  // Предполагается, что пароль берется с формы ввода
    // Логика для передачи нового пароля во внешнюю систему
    // Например, отправка API-запроса на внешний сервер
    external_system_sync( $userdata['user_login'], $new_password );

    return $send;  // Возвращаем исходное значение
}
add_filter('send_password_change_email', 'wpse_send_password_change_email', 10, 3);

Важные замечания

  • Безопасность данных: Убедитесь в безопасности передачи данных между WordPress и вашей внешней системой, например, используя HTTPS или другие методы шифрования.
  • Обслуживание: Создайте документацию по всем использованным хукам и фильтрам, чтобы облегчить обслуживание системы в будущем.
  • Тестирование: Перед развертыванием изменений на живой сайт, тщательно протестируйте их на отдельной среде.

Заключение

Синхронизация паролей между различными системами требует глубокого понимания их архитектуры. Использование доступных фильтров и хуков WordPress представляет эффективное решение данной задачи. Обеспечьте прозрачность и безопасность вашего подхода, чтобы гарантировать надежную аутентификацию пользователей и целостность данных. Надеюсь, это решение удовлетворит ваши требования и надежно интегрирует WordPress с внешней системой.

Оцените материал
Добавить комментарий

Капча загружается...