Разработка REST API в Drupal 7, с помощью Services и Oauth

Сегодня мы будем делать REST API на Drupal 7, с блекджеком и трехшаговой авторизацией через Oauth. На самом деле мы будем использовать немного больше модулей, чем перечислено в заголовке. Вот список тех, которые нам понадобятся, непосредственно для разработки API:

  • CTools
  • Libraries
  • OAuth
  • Services
  • Views

Устанавливаем и включаем все перечисленные модули, привычным для Вас способом. Лично я предпочитаю Drush.

Первым делом, нам нужно настроить модуль Oauth. Идем на страницу его настроек Configuration->Web Services->OAuth (admin/config/services/oauth). Включаем провайдер, ставим галочку напротив «Enable the oauth provider». Время жизни токена можно оставить так как есть по умолчанию, то есть 2 часа (7200 секунд), и альтернативную страницу входа, тоже оставляем по умолчанию.

Теперь нам нужно создать контекст, для этого перейдем на вкладку «Добавить контекст».

Заполняем все по порядку. В имя контекста пишем «API Auth», на вкладке «Signature methods», оставляем все галочки по умолчанию, а на вкладке «Authorization options» вы можете заполнить различные сообщения об успешной или не успешной авторизации.  Время жизни токена можете оставить 0.

И последнее что здесь осталось это добавить «Authorization level»,  для этого нажмите на кнопку «Add authorization level». Здесь можно заполнить только имя и заголовок, а остальное оставить по умолчанию. На такие уровни авторизации (Authorization level) можно назначать права доступа для определенных ролей, позже мы как раз этим займемся.

После того как мы настроили Oauth, нам нужно создать свой сервис, который собственно и будет отдавать данные. Переходим на страницу Structure->Services (admin/structure/services), и нажимаем кнопку «Add», чтобы добавить новую конечную точку (endpoint). Заполняем все так, как на скриншоте ниже и сохраняем новый endpoint. Если у Вас нет галочки «Oauth authentication», то нужно включить одноименный модуль, он идет вместе с модулем Oauth.

После того как мы создали новый сервис и включили в нем авторизацию, нужно выбрать созданный на предыдущих шагах контекст. На странице списка всех сервисов, напротив только что созданного сервиса нажимаем на выпадающем меню, и переходим на страницу «Edit Authentication».

На этой странице выбираем контекст, который мы создали, выбираем уровень авторизации, а в поле «Authorization level»,  выбираем «Consumer key and access token, also known as 3-legged OAuth». Сохраняем.

Теперь нам нужно определить, что именно наш сервис будет отдавать, то есть какие данные и что с этими данными можно будет делать. Переходим на вкладку «Resourses», и напротив доступных сущностей отмечаем операции. Я в своем примере поставил все галочки напротив «Node».

После этих действий, если бы у нас была выключена авторизация, то по адресу /api/node/%nid, нам было бы доступно содержание ноды в том формате, который Вы выбрали на вкладке «Server»  в настройках сервиса. Я выбрал JSON, и кстати убедитесь, что у Вас установлена галочка » «, она обязательна для авторизации.

Так как мы не хотим, что бы доступ к нашему API был у всех подряд (собственно для этого мы и делаем авторизацию),  сейчас мы создадим новую роль «Developer», и назначим ей следующие права:

  • Access own OAuth authorizations
  • Access own OAuth consumers
  • Register OAuth consumers in API Auth
  • Authorize OAuth consumers in API Auth
  • Save file information

О том как выдавать эту роль пользователям, Вы позаботитесь сами.

Зарегистрируйте нового пользователя, и зайдите на сайт от его имени. На странице пользователя Вы увидите вкладку «OAuth Consumers». Перейдите на эту вкладку, нажмите на ссылку «Add consumer», заполните все поля и сохраните. «Callback url» — это адрес страницы, с которой разрешено обращение к API от Вашего имени, и куда будет возвращен токен доступа.

Теперь мы будем получать ноды, с удаленного сервера. Обязательно убедиться, что у Вас на сервере установлено PHP расширение Oauth. Если его нет, то вот инструкция по его установке http://webkul.com/blog/ubuntu-oauth-installation/. Если Вы будете устанавливать по инструкции, у Вас появится ошибка, потому что текущая версия в репозитории требует PHP 7.  Чтобы решить проблему укажите версию расширения:

Ниже приведен код моего примера авторизации и получения данных:

После того как Вы перейдете на «Callback url» в моем случае это https://tuhub.ru/test.php , Вас перебросит на страницу авторизации (если вы конечно еще не авторизованы). После того как Вы авторизуетесь, Вам будет предложено подтвердить доступ.

Как только Вы подтвердите доступ, Вас опять перенаправит на «Callback url», но так как туда уже будет передаваться «Oauth token», ход событий пойдет по другой ветке, и будет отправлен запрос к API на получение ноды с идентификатором 1. В ответ мы получим JSON, который выведем на страницу.

 

Надеюсь моя статья оказалась полезной. Жду замечаний в комментариях!

Комментарии

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

  • ник

    а чуть проконсультироваться можно?