Building better APIs on rails

Post on 05-Aug-2015

69 views 0 download

Transcript of Building better APIs on rails

Building better APIs on RailsRoman Gorel @ kiev.rb #3

Рельсы - не всегда лучше

● Интегрируется с рельсами как Rack mountable engine

● Меньше время ответа● Ничего лишнего

rails-api gem

● Не реквайрит то, что не нужно для API(например, темплейты)

● Ускоряет время ответа

● Уменьшает потребляемые ресурсы

Уберем ненужное

● Для новых приложений

● Для существующих приложений

Добавим роуты

Неймспейсы, версии, формат

Субдомен

http://api.pumpkins.ua/v1/pumpkins

Субдомены в development env

● /etc/hosts

● api.lvh.me

● pow

Структура контроллеров

Делаем API аббревиатурой

Api::V1::PumpkinsController → API::V1::PumpkinsController

config/initializers/inflections.rb

Контроллер

Разные форматы данных?

Сокращаем код

Как поменять представление?

Куча гемов для кастомизации представления

● Темплейты: rabl, jbuilder

● Презентеры: representable, acts_as_api

● Сериалайзеры: ActiveModelSerializers

Путь Очумелых Ручекapp/presenters/api/v1/pumpkin_presenter.rb

Путь Очумелых Ручек

Больше гибкости!

Больше гибкости!

А как насчет коллекций?app/presenters/api/array_presenter.rb

Документация

RDoc

FAIL

Документируем красиво

● swagger

● apipie

● rspec_api_documentation

Документация через тесты

● Не захламляет контроллер● Проще поддерживать в актуальном

состоянии● Прогоняет тесты при генерации● Меньше писать руками● Заставляет писать тесты :)

Документируем из тестовGemfile

spec/support/rspec_api_documentation.rb

Документируем из тестовspec/acceptance/pumpkins_spec.rb

Описываем методы

Описываем методы

Два в одном

$ rake docs:generate

● Прогоняет тесты

● Генерирует доку

Наслаждаемся результатом

Наслаждаемся результатом

Аутентификация

Базовая Аутентификация

Базовая Аутентификация

FAIL :(

Digest Auth + token

● Делаем POST /sessions с захэшированными логином и паролем

● Получаем в ответ токен

● Используем токен в последующих запросах

Digest Auth

Digest Auth$ curl -v --digest -u "Roman:password" -X POST --data {} http://api.pumpkins.ua:3000/v1/sessions

Token

Token $ curl -H 'Authorization: Token token="48990736263c9f573ff634a1cb66cbcd"' http://api.pumpkins.ua:3000/v1/pumpkins

Проблемы

● Сложная аутентификация

● Открытый токен

JSON Web token

● Реализации под множество платформ

● Простота использования

● Секьюрность

jwt.io

Аутентификация с JWT

Аутентификация с JWT

$ curl -H 'Authorization: Token token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.y8f9uijQS6sxeX58dQH4fwJYLxvmBt3HHAvnrj5w1Rg"' http://api.pumpkins.ua:3000/v1/pumpkins

Структура JWT

● Заголовок (тип сообщения и алгоритм, JSON + Base64)

● Тело сообщения (JSON + Base64)● Подпись (тело + заголовок,

зашифрованные секретным ключом)

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.y8f9uijQS6sxeX58dQH4fwJYLxvmBt3HHAvnrj5w1Rg

Попробуем подменить данные

тело сообщения

Тем не менее, токен все еще можно перехватить!

Expiration

Ваши вопросы