50
Building better APIs on Rails Roman Gorel @ kiev.rb #3

Building better APIs on rails

Embed Size (px)

Citation preview

Page 1: Building better APIs on rails

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

Page 2: Building better APIs on rails

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

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

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

Page 3: Building better APIs on rails

rails-api gem

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

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

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

Page 4: Building better APIs on rails

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

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

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

Page 5: Building better APIs on rails

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

Page 6: Building better APIs on rails

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

Page 7: Building better APIs on rails

Субдомен

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

Page 8: Building better APIs on rails

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

● /etc/hosts

● api.lvh.me

● pow

Page 9: Building better APIs on rails

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

Page 10: Building better APIs on rails

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

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

config/initializers/inflections.rb

Page 11: Building better APIs on rails

Контроллер

Page 12: Building better APIs on rails

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

Page 13: Building better APIs on rails

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

Page 14: Building better APIs on rails

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

Page 15: Building better APIs on rails

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

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

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

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

Page 16: Building better APIs on rails

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

Page 17: Building better APIs on rails

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

Page 18: Building better APIs on rails

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

Page 19: Building better APIs on rails

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

Page 20: Building better APIs on rails

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

Page 21: Building better APIs on rails

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

Page 22: Building better APIs on rails

RDoc

FAIL

Page 23: Building better APIs on rails

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

● swagger

● apipie

● rspec_api_documentation

Page 24: Building better APIs on rails

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

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

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

Page 25: Building better APIs on rails

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

spec/support/rspec_api_documentation.rb

Page 26: Building better APIs on rails

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

Page 27: Building better APIs on rails

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

Page 28: Building better APIs on rails

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

Page 29: Building better APIs on rails

Два в одном

$ rake docs:generate

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

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

Page 30: Building better APIs on rails

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

Page 31: Building better APIs on rails

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

Page 32: Building better APIs on rails

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

Page 33: Building better APIs on rails

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

Page 34: Building better APIs on rails

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

Page 35: Building better APIs on rails

FAIL :(

Page 36: Building better APIs on rails

Digest Auth + token

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

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

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

Page 37: Building better APIs on rails

Digest Auth

Page 38: Building better APIs on rails

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

Page 39: Building better APIs on rails

Token

Page 40: Building better APIs on rails

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

Page 41: Building better APIs on rails

Проблемы

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

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

Page 42: Building better APIs on rails

JSON Web token

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

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

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

jwt.io

Page 43: Building better APIs on rails

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

Page 44: Building better APIs on rails

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

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

Page 45: Building better APIs on rails

Структура JWT

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

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

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

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.y8f9uijQS6sxeX58dQH4fwJYLxvmBt3HHAvnrj5w1Rg

Page 46: Building better APIs on rails

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

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

Page 47: Building better APIs on rails

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

Page 48: Building better APIs on rails

Expiration

Page 50: Building better APIs on rails

Ваши вопросы