Upload
roman-gorel
View
68
Download
0
Embed Size (px)
Citation preview
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
Ваши вопросы