Покращуємо авторизацію в WordPress

14

Від автора: У цьому уроці ми попрацюємо з формою авторизації в WordPress. WordPress – це насправді чудова по своїй простоті і функціональності CMS. Проте і в ній є свої недоробки. Однією з таких вад є процес авторизації в WordPress.

Покращуємо авторизацію в WordPress

Автор: Андрій Кудлай

Звуть мене Андрій Кудлай. Родом я з України, живу в Дніпропетровську. Веб-програмування вчився сам. Непогано знаю HTML, CSS, PHP, JavaScript.

Покращуємо авторизацію в WordPressПокращуємо авторизацію в WordPress

Що ж саме нас може не влаштовувати в процесі авторизації в WordPress? Особисто мені не подобаються ті помилки, які WP показує після невдалої авторизації. Наприклад, спробуємо ввести неправильний логін, після якого ми бачимо помилку наступного змісту: ПОМИЛКА: Неправильне ім’я користувача.

Покращуємо авторизацію в WordPress

Якщо ми спробуємо ввести вірний логін, але неправильний пароль, то побачимо вже таке повідомлення: ПОМИЛКА: Введений вами пароль користувача admin невірний.

Покращуємо авторизацію в WordPress

Чим погані дані помилки? Тим, що вони полегшують роботу потенційного хакера, який намагається зламати сайт методом підбору пароля. Коли йде підбір, то тут потрібно підібрати не тільки пароль, але і логін, якщо він невідомий. А ось такими ось помилками, ми підказуємо, що введений варіант логін невірний, або ж, що ось такий ось логін є в системі.

Саме тому хотілося б замість подібних помилок виводити вже традиційне повідомлення на зразок: Невірно введений логін або пароль. Такою помилкою ми вже ніяк не підказувати, що ж з пари логін/пароль було введено невірно. Давайте спробуємо замінити ці помилки.

Для цього ми скористаємося механізмом хуків WP. Хуки – це спеціальні функції, які дозволяють нам взаємодіяти з ядром WP у певні моменти. Наприклад, момент авторизації користувача. Тут ми можемо скористатися спеціальним хуком, тобто функцією, яка спрацює саме в даний момент. Хук (hook) перекладається як «гачок», «зачіпка». І ми в буквальному розумінні слова можемо причепити до хуку власну функцію.

Іншими словами, ми можемо в момент авторизації подивитися, чи успішно користувач авторизувався або виникла помилка. Якщо є помилка, тоді наша функція просто замінить цю помилку. Все досить просто.

Отже, для початку скористаємося хуком login_errors, прикладів роботи з яким можна знайти безліч в мережі. Файл функцій (functions.php вашої теми додайте наступний код:

add_filter( ‘login_errors’, ‘my_login_errors’ );
function my_login_errors(){
return «Помилка!»;
}

Давайте його розглянемо. Отже, для того, щоб прив’язати нашу функцію до хуку, ми можемо скористатися функціями add_filter() або add_action() в залежності від того, чи є даний хук фільтром або дією.

Функція add_filter() чіпляє до фільтру login_errors() нашу функцію my_login_errors(), яка описана нижче. Фільтр login_errors() застосовується до помилок авторизації, які виводяться на екран. Відповідно, ми можемо просто замінити ці помилки своєї, що ми і робимо, повертаючи потрібний текст помилки функцією my_login_errors(). Загалом, нічого складного.

Спробуємо авторизуватися тепер. Як бачимо, на екран зараз виводиться наш текст помилки і у разі невірного введення логіна, і у випадку вірного введення логіна. Все начебто чудово. Але от халепа: у разі вірного введення логіна цей логін запам’ятовується в поле форми для введення імені користувача, що дає зрозуміти потенційному зломщикові, що логін був введений вірно.

Тому очевидно, що даний код вирішив нашу проблему лише частково. Що ж робити? Давайте спробуємо скористатися іншим хуком, який не займається виведенням помилок на екран, а безпосередньо пов’язаний з авторизацією і поверненням даних. Для цього ми скористаємося фільтром authenticate.

У відео версії уроку ви знайдете докладний опис роботи з даними хуком. Тут же я наведу сам код і трохи прокоментую роботу з ним:

add_filter( ‘authenticate’, ‘my_auth’, 20, 3 );
function my_auth($user, $username, $password){
if( isset( $user->errors[‘invalid_username’] ) || isset( $user->errors[‘incorrect_password’] ) ){
return new WP_Error(‘broke’, ‘ПОМИЛКА: невірний логін або пароль’);
}
return $user;
}

Отже, до фільтру authenticate ми причепили функцію my_auth(). Також передамо 2 додаткові параметри. Третій параметр – 20 – відповідає за пріоритет виконання функції (за замовчуванням 10). Чим вище пріоритет, тим пізніше функція виконається. Наша функція повинна виконається пізніше доданих до authenticate фільтрів, тому ми встановили пріоритет більше 10. Четвертий параметр – 3 – відповідає за кількість аргументів, яке прийматиме наша користувацька функція. Функція my_auth() повинна прийняти саме 3 аргументу, описи яких ви можете знайти у документації до хуку authenticate.

Ну і можемо перевірити наш код. Тепер, навіть якщо ми введемо вірний логін, але невірний пароль, логін не буде зберігатися. Ну і при некоректній авторизації ми завжди будемо бачити власний текст помилки.

На цьому я з вами прощаюся. Удачі і до нових зустрічей!