WP REST API – настройка и использование OAuth 1.0a аутентификации – CMScafe

Почему мне установили эту форму

В настоящий момент на ваш сайт проводится Brute-force атака. Brute-force атака — это атака по подбору паролей. В данном случае происходит подбор пароля к административной панели вашего сайта.

Чтобы не допустить взлома вашего сайта и повысить его безопасность, нами была установлена дополнительная защита.

Получение временных учётных данных

Для получения временных учётных данных мы отправляем POST запрос в конечную точку /oauth1/request. Запрос должен содержать параметры oauth_consumer_key и oauth_consumer_secret, которые были получены при генерации нового потребителя приложения.

Также запрос должен содержать параметры oauth_consumer_key и oauth_consumer_secret. При использовании Postman oauth_signature генерируется автоматически и нам остаётся только определить параметр oauth_signature_method. На данный момент, плагин поддерживает только метод HMAC-SHA1.

Эти параметры могут быть переданы любым из трёх способов:

  1. Через заголовок Authorization
  2. Через параметры GET запроса в URL
  3. Через тело POST запроса. Типом контента в данном случае должен быть application/x-www-form-urlencoded.

Вы можете выбрать любой из этих способов.

Давайте начнём процесс с запуска Postman и отправки POST запроса в конечную точку запроса временных учётных данных. Но перед этим, скопируйте параметры Consumer Key и Consumer Secret из зарегистрированного приложения.

Настройте Postman для отправки POST запроса вашу конечную точку временных учётных данных. Далее во вкладке Authorization выберите опцию OAuth 1.0. Заполните Consumer Key and Consumer Secret. Убедитесь, что опция Signature Method выставлена в HMAC-SHA1.

Кликните на Update Request и далее на кнопку Send. Если ошибки не было, то сервер вернёт код статуса 200 – OK вместе с телом ответа:

oauth_token=tyNCKaL3WAJXib5SI6jCnr4P&oauth_token_secret=1GiImP2XBacmk4FhcEFtqqENs3Bt6Q1m3zDf5s0Rk2kDJyTF&oauth_callback_confirmed=true

Тело ответа содержит три параметра для осуществления следующего шага:

  1. oauth_token – временный OAuth токен для шага авторизации.
  2. oauth_token_secret – временная секретная строка для использования вместе с oauth_token.
  3. oauth_callback_confirmed – этот параметр возвращается всегда, вне зависимости от того, предоставили вы параметр oauth_callback или нет.

Теперь мы готовы к шагу авторизации.

Авторизация пользователя

Для шага авторизации мы открываем конечную точку авторизации владельца в браузере и передаём oauth_token и oauth_token_secret, полученные на предыдущем шаге:

Обмен токенами

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

Для инициализации процесса обмена токенами, вернитесь в Postman и настройте его для отправки POST запроса в конечную точку запроса токена.

Далее во вкладке Authorization выберите опцию OAuth 1.0 заполните Consumer Key and Consumer Secret. Для полей Token и Token Secret используйте значение параметров oauth_token и oauth_token_secret (временные учётные данные), которые мы получили на первом шаге.

Так как мы можем передать параметры в URL, добавьте параметр oauth_verifier:

Authentication with the wp rest api

The WP REST API provides three options for authentication, each intended for a specific purpose. These options are:

  • basic authentication
  • OAuth authentication
  • cookie authentication

Installing the plugin

As mentioned above, the plugin is available on GitHub from the WP REST API team. So all we need to do is to clone it in our plugins directory and activate it.

Head over to your /wp-content/plugins/ directory and clone the plugin for which you may need sudo rights to run the command. To do so, issue the following:

What is authentication?

In its most basic definition, authentication is the process of determining the identity of a person.

According to Webopedia:

Авторизация запроса

Это супер-редкость – когда для взаимодействия с API вам достаточно указать лишь URL, как мы делали в примере выше.

Базовая авторизация

Базовая авторизация (Basic Authentication, BasicAuth) – нередко бывает нужна для взаимодействия с API с чуть более серьёзным назначением, например проведение оплаты через платёжный шлюз.

Знакомимся с oauth аутентификацией

Что вы делаете, когда вам необходимо зайти в админку WordPress? Вы просто переходите на страницу авторизации и вводите свои имя пользователя и пароль, верно? Всё просто! А что если вы используете сторонний сервис, которому необходим доступ к вашим WordPress ресурсам (посты, страницы, медиа и т.п.)? Отдадите ли вы им свои учётные данные? Ответ тут, вероятнее всего, “Нет”.

В традиционной модели аутентификации существует две роли:

  1. Клиент – это может быть пользователь, приложение или сервис.
  2. Провайдер ресурсов – сервер, на котором расположены защищённые ресурсы.

Если клиент хочет получить доступ к защищённым ресурсам, он будет аутентифицирован путём предоставления учётных данных серверу, и получит необходимый доступ.

Проблема возникает тогда, когда доступ к этим защищённым ресурсам необходим стороннему сервису. Этому сервису по понятным причинам не могут (и не должны) быть предоставлены учётные данные.

Вот где на помощь приходит методология OAuth аутентификации. Она вводит новую роль в процесс аутентификации – владелец ресурса. Теперь в процессе аутентификации есть три роли:

  1. Клиент – не собственно пользователь, а стороннее приложение или сервис, который действует от имени пользователя, и получает доступ к защищённым ресурсам.
  2. Сервер – сервер, на котором расположены защищённые ресурсы.
  3. Владелец ресурса – непосредственно пользователь.

Итак, согласно Webopedia:

Как работает oauth аутентификация

OAuth API для WordPress построен на спецификациях OAuth 1.0a, поэтому далее мы будет говорить только о том, как работает OAuth 1.0a.

OAuth работает с использованием токенов учётных данных, которые выдаются провайдером ресурса (сервером) по запросу владельца ресурса после того, как он аутентифицировал себя, используя учётные данные. Эти токены (ассоциированные с владельцем ресурса) потом используются клиентом (сторонним приложением или сервисом) для получения доступа к защищённым ресурсам.

Эти токены учётных данных имеют ограниченный срок жизни и могут быть отозваны сервером по запросу владельца ресурса.

Ниже представлен путь прохождения запроса в OAuth:

  1. Клиент отправляет подписанный запрос на сервер для получения токена запроса (Request Token), также известного как временные учётные данные (Temporary Credentials). Этот запрос отправляется в конечную точку URI временных учётных данных и содержит следующее:
    • oauth_consumer_key: предоставляется сервером
    • oauth_timestamp
    • oauth_nonce
    • oauth_signature
    • oauth_signature_method
    • oath_callback
    • oauth_version (опционально)
  2. Сервер верифицирует запрос и если он валиден, то предоставляет токен запроса (Request Token), который содержит:
    • oauth_token
    • oauth_token_secret
    • oauth_callback_confirmed
  3. Клиент отправляет владельца ресурса (пользователя) на сервер для авторизации запроса. Это делается путём создания URI запроса, который содержит oauth_token, полученный на предыдущем шаге. Запрос приходит в конечную точку URI авторизации владельца ресурса (Resource Owner Authorization).
  4. Владелец ресурса (пользователь) авторизовывается на сервере путём предоставления учётных данных.
  5. Если на первом шаге был предоставлен oauth_callback URI, то сервер перенаправляет клиента на этот URI и добавляет следующие параметры в строку запроса:
    • oauth_token: полученный на втором шаге
    • oauth_verifier: используется для того, чтобы убедиться в том, что владелец ресурса, который выдал доступ, тот же, что был возвращён клиенту
  6. Если на первом шаге не был предоставлен oauth_callback URI, то сервер отображает значение oauth_verifier, чтобы владелец ресурса мог бы подтвердить клиента вручную.
  7. После получения oauth_verfier клиент запрашивает у сервера токены учётных данных, путём отправки запроса в конечную точку токена запроса (Token Credentials Request). Это запрос содержит следующее:
    • oauth_token: полученный на втором шаге
    • oauth_verfier: полученный на пятом шаге
    • oauth_consumer_key: предоставляется провайдером ресурса (сервером), перед тем, как начать рукопожатие oauth
    • oauth_signature
    • oauth_signature_method
    • oauth_nonce
    • oauth_version
  8. Сервер проверяет запрос и выдаёт токен учётных данных (Token Credentials):
    • oauth_token
    • oauth_token_secret
  9. Клиент использует токен учётных данных для доступа к защищённым ресурсам сервера.

Информация выше может быть передана либо через строку запроса URI, либо в заголовке Authorization, причём заголовок предпочтительнее в плане безопасности.

Этот длинный процесс должен приниматься во внимание при разработке своих собственных клиентов для взаимодействия с API. Но так как мы будем использовать пакет, предоставленный командой WP REST API, все эти детали будут вынесены в абстракцию, и мы сможем получить токен учётных данных за минимальное количество шагов.

Всё это привело нас к трём конечным точкам URI:

  1. Temporary Credential Request (запрос временных учётных данных)
  2. Resource Owner Authorization (авторизаци владельца ресурсов)
  3. Token Credentials Request (запрос учётных данных токена)

Эти URI предоставляются сервером различными путями. Одним из таких путей является их раскрытие в ответе сервера при проверке API. API OAuth аутентификации для WordPress REST API использует такой же метод.

Теперь, когда мы рассмотрели принципы работы OAuth, следующим шагом будет установка и включение API OAuth аутентификации в WordPress.

Коды ответа

В примере выше мы проверяли код ответа от сервера функцией wp_remote_retrieve_response_code(). В таблице перечислены наиболее часто встречающиеся из них:

Код ответа (Status code)Описание
200OK
301Редирект (перемещена навегда)
302Редирект (перемещена временно)
403Доступ запрещён
404Страницы не существует
500Ошибка на сервере
503Сервер недоступен

Отправка тестового аутентифицированного запроса

Теперь, когда мы получили наши учётные данные токена, мы можем попробовать отправить тестовый запрос на сервер через Postman.

Мы отправим запрос DELETE для удаления поста с id равным 50.

Для этого вам понадобятся:

  • oauth_consumer_key: получен на первом шаге
  • oauth_consumer_secret: получен на первом шаге
  • oauth_token: получен на последнем шаге
  • oauth_token_secret: получен на последнем шаге

Выберите опцию OAuth 1.0 во вкладке Authorization и заполните первые четыре поля:

Кликните на кнопку Update Request. Если у вас отмечена опция Add params to header, то запрос будет отправлен в заголовке, а не строке запроса URL.

Отправьте запрос и вы должны получить код статуса 200 – OK от сервера, что говорит о том, что пост был удалён успешно.

Передача ключа api

Тут трудностей возникнуть не должно. Ключ чаще всего мы добавляем дополнительным GET-параметром к урлу, например:

Или:

Проверка наличия oauth api

Перед тем, как мы инициируем рукопожатие (handshake) OAuth, мы должны проверить, что API доступно на сервере. Это можно сделать путём отправки простого GET запроса в конечную точку wp-json/ и затем проанализировать ответ сервера.

Управление паролем и сброс кеша пользователя

Для смены пароля пользователя используется функция “wp_set_password”. Эта функция принимает два аргумента:

Установка api oauth аутентификации

API OAuth аутентификации API для WordPress позволяет серверу принимать аутентифицированные запросы используя реализацию OAuth. Он построен на спецификациях OAuth 1.0a и расширяет их с помощью дополнительного параметра wp_scope, который посылается в конечную точку временных учётных данных (Temporary Credential Request).

Плагин доступен на Github и поддерживает только версию WordPress 4.4 или выше.

Давайте клонируем плагин в директорию /wp-content/plugins/:

Хранение паролей в базе данных

В базе данных сайта пароли не хранятся в открытом виде. Они преобразуются с помощью хеш-функций в строки из набора символов и сохраняются в базе. К примеру, вот хеш, созданный по алгоритму MD5 для строки “MouseDC” :

0ab551bfb9d2f08146d280ffdf016e9e

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

Функция “wp_check_password” за проверку-сравнение введённого пароля с сохранённым хешем. Эта функция возвращает логические false или true в случае успешного сравнения кеша и вводимого пароля. У функции есть три парамета:

Sending authenticated requests from the command line

We can use the command line to send authenticated requests using this method. Consider the following curl equivalent of the above request:

Sending authenticated requests using javascript

If you are using a client-side JavaScript framework, such as jQuery, to interact remotely with a WordPress site having WP API enabled, you can send the authorization headers in an AJAX request. Consider the following DELETE request sent through the jQuery.ajax() method:

Похожее:  В ААЛДЕЙБЕРИС ЛИЧНЫЙ КАБИНЕТ ВОЙТИ ПО НОМЕРУ ТЕЛЕФОНА

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

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