roman gorel: building better apis on rails

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

Upload: sphere-consulting-inc

Post on 08-Jul-2015

144 views

Category:

Technology


0 download

DESCRIPTION

Building better APIs on Rails.

TRANSCRIPT

Page 1: Roman Gorel: Building better APIs on Rails

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

Page 2: Roman Gorel: Building better APIs on Rails

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

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

mountable engine

● Меньше время ответа

● Ничего лишнего

Page 3: Roman Gorel: Building better APIs on Rails

rails-api gem

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

(например, темплейты)

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

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

Page 4: Roman Gorel: Building better APIs on Rails

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

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

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

Page 5: Roman Gorel: Building better APIs on Rails

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

Page 6: Roman Gorel: Building better APIs on Rails

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

Page 7: Roman Gorel: Building better APIs on Rails

Субдомен

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

Page 8: Roman Gorel: Building better APIs on Rails

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

● /etc/hosts

● api.lvh.me

● pow

Page 9: Roman Gorel: Building better APIs on Rails

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

Page 10: Roman Gorel: Building better APIs on Rails

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

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

config/initializers/inflections.rb

Page 11: Roman Gorel: Building better APIs on Rails

Контроллер

Page 12: Roman Gorel: Building better APIs on Rails

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

Page 13: Roman Gorel: Building better APIs on Rails

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

Page 14: Roman Gorel: Building better APIs on Rails

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

Page 15: Roman Gorel: Building better APIs on Rails

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

представления

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

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

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

Page 16: Roman Gorel: Building better APIs on Rails

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

Page 17: Roman Gorel: Building better APIs on Rails

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

Page 18: Roman Gorel: Building better APIs on Rails

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

Page 19: Roman Gorel: Building better APIs on Rails

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

Page 20: Roman Gorel: Building better APIs on Rails

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

Page 21: Roman Gorel: Building better APIs on Rails

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

Page 22: Roman Gorel: Building better APIs on Rails

RDoc

FAIL

Page 23: Roman Gorel: Building better APIs on Rails

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

● swagger

● apipie

● rspec_api_documentation

Page 24: Roman Gorel: Building better APIs on Rails

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

● Не захламляет контроллер

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

состоянии

● Прогоняет тесты при генерации

● Меньше писать руками

● Заставляет писать тесты :)

Page 25: Roman Gorel: Building better APIs on Rails

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

spec/support/rspec_api_documentation.rb

Page 26: Roman Gorel: Building better APIs on Rails

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

Page 27: Roman Gorel: Building better APIs on Rails

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

Page 28: Roman Gorel: Building better APIs on Rails

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

Page 29: Roman Gorel: Building better APIs on Rails

Два в одном

$ rake docs:generate

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

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

Page 30: Roman Gorel: Building better APIs on Rails

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

Page 31: Roman Gorel: Building better APIs on Rails

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

Page 32: Roman Gorel: Building better APIs on Rails

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

Page 33: Roman Gorel: Building better APIs on Rails

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

Page 34: Roman Gorel: Building better APIs on Rails

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

Page 35: Roman Gorel: Building better APIs on Rails

FAIL :(

Page 36: Roman Gorel: Building better APIs on Rails

Digest Auth + token

● Делаем POST /sessions с

захэшированными логином и паролем

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

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

запросах

Page 37: Roman Gorel: Building better APIs on Rails

Digest Auth

Page 38: Roman Gorel: 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: Roman Gorel: Building better APIs on Rails

Token

Page 40: Roman Gorel: Building better APIs on Rails

Token

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

Page 41: Roman Gorel: Building better APIs on Rails

Проблемы

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

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

Page 42: Roman Gorel: Building better APIs on Rails

JSON Web token

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

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

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

jwt.io

Page 43: Roman Gorel: Building better APIs on Rails

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

Page 44: Roman Gorel: Building better APIs on Rails

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

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

Page 45: Roman Gorel: Building better APIs on Rails

Структура JWT

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

JSON + Base64)

● Тело сообщения (JSON + Base64)

● Подпись (тело + заголовок,

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

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.y8f9uijQS6sxeX58dQH4fwJYLxvmBt3HHAvnrj5w1Rg

Page 46: Roman Gorel: Building better APIs on Rails

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

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

Page 47: Roman Gorel: Building better APIs on Rails

Тем не менее, токен все еще

можно перехватить!

Page 48: Roman Gorel: Building better APIs on Rails

Expiration

Page 49: Roman Gorel: Building better APIs on Rails

github.com/rgorel/pumpkins

Page 50: Roman Gorel: Building better APIs on Rails

Ваши вопросы