JWT WordPress

JWT Аутентификация для WordPress по средствам REST API Leave a comment

Часто на различных форумах встречается информация с вопросами о том как можно организовать Аутентификацию\Авторизацию пользователей с внешних сервисов на WordPress.

Под внешними сервисами подразумевается некий фронтенд (например VueJS, Angular и т.д) или мобильные приложения. Но так же часто можно встретить ответы лишённые конструктивна и склоняющие к использованию в качестве бэкенда Nodejs, Laravel, Symfony и т.д, но как быть если всё таки в качестве бэкенда хочется использовать именно WordPress, расскажем ниже по тексту.Немного теории: 

JSON Web Token (JWT) — это открытый стандарт для создания токенов доступа, основанный на формате JSON. Как правило, используется для передачи данных для аутентификации в клиент-серверных приложениях. Токены создаются сервером, подписываются секретным ключом и передаются клиенту, который в дальнейшем использует данный токен для подтверждения своей личности.

Чем удобен JWT сходу, на наш взгляд:

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

Реализация:

Реализация, в нашем случае, построена на взаимодействии VueJS фронтенда и REST API (wp-json) WordPress в качестве бэкенда. Здесь мы затронем только то что относится к работе WordPress + немного composer библиотек.

Нам понадобится:

  • WordPress
  • JWT библиотека написанная на PHP — источник https://github.com/lcobucci/jwt и иснтрукция для composer + примеры

Создадим Роут WordPress, который будет отвечать за авторизацию

Обычный роут который принимает логин и пароль, после обработки вызывается колбэк — adminLogin

Суть колбэка «adminLogin» — в том что принять логин и пароль, проверить их в базе пользователей WordPress и далее приступить к созданию токена, которым мы будем обмениваться с клиентом (фронтом).

Исходно (по утверждению автора и в версии 3.3) библиотека «cobucci/jwt» не создана для того что бы делать рефреш-токен, по этому процедуру пересоздания токена JWT — мы можем сделать самостоятельно.

В нашем случаем логика с рефрешем следующая:

  1. При авторизации (ввод логина и пароля) на фронте, сервер в заголовках ответа — возвращает токен и рефреш-токен. Эти две строки мы сохраняем на фронте для будущего использования
  2. При запросах с фронта мы отправляем токен и рефреш для того что бы бэк убедился что мы это мы. (рефреш можно и пожалуй нужно слать лишь тогда когда время токена истекло, но это здесь не рассматривается)
  3. Если WordPress обнаружил что токен истёк, то в качестве подтверждения берётся рефреш-токен. Если с рефреш-токеном всё хорошо и ему соответствует запись в таблице, создаётся новый токен и снова эти данные отправляются клиенту как в пункте 1
  4. Если токен и рефреш-токен не сработали — мы должны ответить клиенту — отказом в валидации и выполнить каки-то действия

 

Ниже код обёртка над библиотекой jwt

В этом классе можно:

  • Создать токен
  • Создать рефреш-токен
  • Проверить токен на валидность
  • Добавить запись в таблицу
  • Получить ИД пользователя через токен
  • Получить ИД пользователя через рефреш-токен

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

Если функция возвращает true — будет выполнен колбэк роута WordPress

Метод пересоздания токена

Метод добавляет в заголовки ответа для клиента новую пару значений токена и рефреш-токена.

Тестовый роут WordPress для проверки работы JWT

 

JWT Авторизация в WordPress
JWT Авторизация в REST API WordPress

Пример передачи заголовков для аутентификации. Как видно из скриншота, WordPress ответил нам отказом, так как токен устарел, а рефреш-токен оказался не валиден(либо тоже устарел, либо не верный)

Ниже пример самой авторизации в WordPress через Rest API с последующим действием получения токена в заголовках ответа

JWT Авторизация при помощи REST API
JWT Авторизация при помощи REST API WordPress

 

 

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *