SlideShare a Scribd company logo
Mad Talks #1 2018
Современный graphql на бекенде и фронтенде.
Тестирование, секьюрити, новые возможности
Александр Вишняков и Улукбек Джунусов
Что такое graphql сейчас?
● Это фронтенд ориентированный интерфейс
● Не уступает REST
● Гибкость в получении данных (YAGNI) https://ru.wikipedia.org/wiki/YAGNI
● Возможность разграничивать доступ на уровне вложенных запросов
(реализуется в каждом случае по разному) пока нет встроенного
механизма.
● Возможность производить несколько запросов различных не связанных
данных в одном HTTP запросе! (с REST такого не получится)
● Большинство нововведений коснулись фронтенд части! (и это
правильно! Клиент сейчас становится многофункциональным).
REST недостатки :(
● REST - сложно указывать бекенду, что нужно включить
● в ответ, а что нет.
● Можно использовать нестандартный параметр ( json-server )
/users?_extends=role
● Разные схемы построения запросов (Flat rest, Long train rest)
● Flat rest - /resource или /resource/:id
● Long train rest - /user/1/favorites/1/detail или
/posts/1/comments/1/likes/1/description…. Ту ту ту ту ту
GraphQL - запрос
GraphQL
запрос
данных из
разных (не
связанных)
коллекций
за один раз
GraphQL resolvers
Это основа всех запросов в Graphql -
при помощи резолверов, извлекаются
данные из БД и передаются пользователю
Scalar Types
Int, String
и так далее…
Но можно
создать
собственные
и тоже так же
через
резолверы объявить
Graphql модели
const Role = `
type Role {
id: Int!
name: String!
permissions(first: PaginationAmount, after: String, filter: RolePermissionFilter): PermissionPaginated! @cost(multipliers: ["first"], complexity: 2)
}
`;
module.exports = Role;
Graphql Input types
const UpdateUser = `
input UpdateUser {
id: Int!
patch: CreateUser
}
`;
module.exports = UpdateUser;
updateUser(input: UpdateUser!): UserEdgeconst CreateUser = `
input CreateUser {
name: String
email: String
roleId: Int
password: String
}
`;
module.exports = CreateUser;
GraphQL model = Уровень презентации
(Presentation Layer)
● Модели graphql отличаются от моделей в БД
● При помощи резолверов можно объединять данные вместе
● Выдавать данные в понятной и удобной форме
● Ограничивать поля видимые пользователю (при этом не нужно
использовать какие либо мапперы для удаления)
GraphQL модель = разделяй и властвуй
● Древовидная структура зависимостей модели.
● Отсутствие толстых/перегруженных моделей.
● Возможность разграничивать доступы на каждую вложенную
зависимость модели. (будь это профиль пользователя или его фин.
данные и т.д.)
Тестирование npm test
● Я использую supertest + jest для интеграционных тестов или e2e тестов
● Запуск тестов производится параллельно
● Для каждого Jest worker’a создается своя sqlite база данных.
● Для каждого Jest worker’a поднимается инстанс сервера на рандомном
порту.
● Перед каждым тестом очищаются данные в БД.
Тестирование npm test
Структура папки с тестами:
Envs - кастомное окружение для
поднятия сервера
Expectations - вынесены проверки с
использованием expect.objectContaining
Factories - папка с фабриками для
создания той или иной сущности в БД
с использованием faker.js.
Mutations/Queries - объявления
запросов и мутаций
Тестирование npm test
Фабрика для
создания
одиночной
сущности
User
Тестирование npm test
● Фабрика для создания нескольких сущностей User
● Задействуется фабрика для создания одиночной сущности User
Тестирование npm test
Пример из папки expectations
При этом в ответе могут
содержаться другие поля (locations)
и так далее, но
expect.objectContaining позволяет
проверить только нужные поля и их
контент, expect.arrayContaining
позволяет пройтись по массиву
объектов и выполнить проверки для
каждого объекта в массиве
Тестирование
npm test
Пример интеграционного теста
Тестирование npm test
Пример очистки БД с использованием средств Sequelize ORM
GraphQL Security
● Что ожидает тех кто связался с graphql
○ В основном это различного вида DDoS (отказ в обслуживании)
● Как достигается?
○ Отправкой серверу данных огромного размера
○ Создание запросов заставляющих вернуть огромное кол-во данных
(что занимает значительные ресурсы сервера). Манипуляция
параметрами пагинации.
○ Запросы с большой вложенностью (путем рекурсивного обращения к
зависимостям)
GraphQL Security
● Как бороться?
○ Проверка длины входного запроса и в случае превышения лимита не передавать его на
парсинг.
this.app.use('*', this.queryLengthLimiter);
GraphQL Security
Проверкой глубины вложенности npm пакет graphql-depth-limit
const depthLimit = require('graphql-depth-limit');
GraphQL Security
GraphQL Security
С использованием пакета graphql-cost-analysis для анализа веса запроса
const costAnalysis = require('graphql-cost-analysis').default;
GraphQL Security
GraphQL Security
GraphQL Security
Использовать Custom Scalar Types для установки лимитов при валидации
параметров запроса (пагинация)
GraphQL Security
С использованием пакета graphql-input-number
GraphQL Security
Принцип белого листа возможных легитимных запросов
Используется библиотека persistgraphql
{
"scripts": {
"postbuild": "persistgraphql src api/query-whitelist.json"
}
}
if (!whitelist[query]) {
throw new Error('Query is not in whitelist.');
}
GraphQL Security
{"query getUserById($id: Int!) {n user(id: $id) {n cursorn node {n idn
namen emailn role {n idn namen }n }n }n}n":1}
Новые возможности
В основном реализованы на клиенте и это верно, так как клиент более
функционален чем бекенд в наше время.
И тем более что все чаще приходят к BaaS, Serverless архитектуре.
Это появление <Query>, <Mutation>, <Subscription> компонентов в react-
apollo, которые теперь учитывают жизненный цикл реакт компонента и
намного упрощают тестирование и запрос данных.
Вопросы?

More Related Content

PDF
специализированные http-демона (Сергей Боченков, Александр Панков)
PDF
Андрей Лузин
PDF
Артем Титаренко
PDF
Денис Трифонов
PDF
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
PPTX
Использование Mock-объектов в TDD на платформе .NET
PDF
Ivan Kotlyar. PostgreSQL in web applications
PDF
Python Development process in Yandex
специализированные http-демона (Сергей Боченков, Александр Панков)
Андрей Лузин
Артем Титаренко
Денис Трифонов
Bosun современный мониторинг / Дима Медведев (OneTwoTrip)
Использование Mock-объектов в TDD на платформе .NET
Ivan Kotlyar. PostgreSQL in web applications
Python Development process in Yandex

What's hot (19)

PPT
Serge P Nekoval Grails
PDF
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
PDF
Профилирование кода на C/C++ в *nix системах
PDF
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
PPTX
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогра...
PDF
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
PDF
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
PPTX
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
PDF
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
PPT
МАПО 2013 Лекция 04 Фабрика Blockly
PPT
МАПО 2013 Лекция 03 Программирование Blockly
POTX
Разработка надежных параллельных, распределенных приложений: быстро и дешево
PPTX
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
PPTX
Apex OOP Patterns (Valery Dvornichenko)
PDF
Александр Саитов «Основы профилирования и оптимизации приложений в .NET»
PDF
Как приручить реактивное программирование
PDF
PostgreSQL в высоконагруженных проектах
PDF
Олег Бартунов и Иван Панченко
PDF
Павел Прищепа - Drupal хостинг полного цикла
Serge P Nekoval Grails
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
Профилирование кода на C/C++ в *nix системах
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогра...
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
Иван Кожин «Saritasa Tools или ещё один подход к архитектуре приложения»
МАПО 2013 Лекция 04 Фабрика Blockly
МАПО 2013 Лекция 03 Программирование Blockly
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Пишем свою платформу для управления данными. Это очень просто / Суханов Васил...
Apex OOP Patterns (Valery Dvornichenko)
Александр Саитов «Основы профилирования и оптимизации приложений в .NET»
Как приручить реактивное программирование
PostgreSQL в высоконагруженных проектах
Олег Бартунов и Иван Панченко
Павел Прищепа - Drupal хостинг полного цикла
Ad

Similar to Современный graphql на бекенде и фронтенде. Тестирование, секьюрити, новые возможности (20)

PDF
IT-инфраструктура. FAQ для разработчика
PDF
20111002 information retrieval raskovalov_lecture3
PDF
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
PDF
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
PDF
PostgreSQL: вчера, сегодня, завтра, Олег Бартунов, Postgres Professional, Мо...
ODP
PDF
GCP для работы с большими данными
PDF
кри 2014 elastic search рациональный подход к созданию собственной системы а...
PDF
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
PPTX
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
PPTX
Software craftsmanship 12 online highload systems
PDF
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
PDF
Java 9: what is there beyond modularization
PPT
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
PPT
Grails. Поиски закончены.
PPTX
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
PPTX
Что такое Postgresql (Максим Богук)
PDF
Максим Богук. Postgres-XC
PDF
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
PDF
От Make к Ansible
IT-инфраструктура. FAQ для разработчика
20111002 information retrieval raskovalov_lecture3
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
PostgreSQL: вчера, сегодня, завтра, Олег Бартунов, Postgres Professional, Мо...
GCP для работы с большими данными
кри 2014 elastic search рациональный подход к созданию собственной системы а...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Software craftsmanship 12 online highload systems
2015-12-06 Антон Тарасенко - Ваш следующий сервис будет асинхронным
Java 9: what is there beyond modularization
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Grails. Поиски закончены.
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"
Что такое Postgresql (Максим Богук)
Максим Богук. Postgres-XC
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
От Make к Ansible
Ad

More from Mad Devs (20)

PPTX
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
PPTX
Дружелюбнй онбординг: как с увеличением количества не потерять качество
PPTX
Mad Stream: Software Architecture 101.
PPTX
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
PDF
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
PDF
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
PDF
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
PDF
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
PDF
Mad Talks. Astashov_splitbrain
PPTX
Flutter vs Native App Development
PDF
Mad Talks. Marketing tips for tech companies
PDF
The paradox of choice in design
PDF
Git and Github for Beginners
PDF
How to hire freelancers
PDF
Ethereum blockchain
PDF
"Outside In". Web application testing.
PDF
Asynchrony in python exists and why should you use it
PDF
Ethereum: аспекты разработки смарт-контрактов
PDF
Why we sleep. Michael Ivashenko
PDF
Удаленное управление приложением и его аналитика
Держите одеяло у себя: как общаться с кандидатом и узнавать все, что вам инте...
Дружелюбнй онбординг: как с увеличением количества не потерять качество
Mad Stream: Software Architecture 101.
Mad Stream: Соло-прокачка мобильного разработчика. Спикер - Айбек Ногоев.
Mad Stream - 7 habits of highly awesome developers. Speaker - Anatoliy Fedorenko
Mad Stream: "Что можно напечатать на 3d принтере, помимо еще одного 3d принте...
Maв Stream: "Факт карты на службек у ПМа", спикер – Дмитрий Кононенко
Лайфхаки менеджмента на удаленке от Дмитрия Кононенко
Mad Talks. Astashov_splitbrain
Flutter vs Native App Development
Mad Talks. Marketing tips for tech companies
The paradox of choice in design
Git and Github for Beginners
How to hire freelancers
Ethereum blockchain
"Outside In". Web application testing.
Asynchrony in python exists and why should you use it
Ethereum: аспекты разработки смарт-контрактов
Why we sleep. Michael Ivashenko
Удаленное управление приложением и его аналитика

Современный graphql на бекенде и фронтенде. Тестирование, секьюрити, новые возможности

  • 1. Mad Talks #1 2018 Современный graphql на бекенде и фронтенде. Тестирование, секьюрити, новые возможности Александр Вишняков и Улукбек Джунусов
  • 2. Что такое graphql сейчас? ● Это фронтенд ориентированный интерфейс ● Не уступает REST ● Гибкость в получении данных (YAGNI) https://ru.wikipedia.org/wiki/YAGNI ● Возможность разграничивать доступ на уровне вложенных запросов (реализуется в каждом случае по разному) пока нет встроенного механизма. ● Возможность производить несколько запросов различных не связанных данных в одном HTTP запросе! (с REST такого не получится) ● Большинство нововведений коснулись фронтенд части! (и это правильно! Клиент сейчас становится многофункциональным).
  • 3. REST недостатки :( ● REST - сложно указывать бекенду, что нужно включить ● в ответ, а что нет. ● Можно использовать нестандартный параметр ( json-server ) /users?_extends=role ● Разные схемы построения запросов (Flat rest, Long train rest) ● Flat rest - /resource или /resource/:id ● Long train rest - /user/1/favorites/1/detail или /posts/1/comments/1/likes/1/description…. Ту ту ту ту ту
  • 6. GraphQL resolvers Это основа всех запросов в Graphql - при помощи резолверов, извлекаются данные из БД и передаются пользователю
  • 7. Scalar Types Int, String и так далее… Но можно создать собственные и тоже так же через резолверы объявить
  • 8. Graphql модели const Role = ` type Role { id: Int! name: String! permissions(first: PaginationAmount, after: String, filter: RolePermissionFilter): PermissionPaginated! @cost(multipliers: ["first"], complexity: 2) } `; module.exports = Role;
  • 9. Graphql Input types const UpdateUser = ` input UpdateUser { id: Int! patch: CreateUser } `; module.exports = UpdateUser; updateUser(input: UpdateUser!): UserEdgeconst CreateUser = ` input CreateUser { name: String email: String roleId: Int password: String } `; module.exports = CreateUser;
  • 10. GraphQL model = Уровень презентации (Presentation Layer) ● Модели graphql отличаются от моделей в БД ● При помощи резолверов можно объединять данные вместе ● Выдавать данные в понятной и удобной форме ● Ограничивать поля видимые пользователю (при этом не нужно использовать какие либо мапперы для удаления)
  • 11. GraphQL модель = разделяй и властвуй ● Древовидная структура зависимостей модели. ● Отсутствие толстых/перегруженных моделей. ● Возможность разграничивать доступы на каждую вложенную зависимость модели. (будь это профиль пользователя или его фин. данные и т.д.)
  • 12. Тестирование npm test ● Я использую supertest + jest для интеграционных тестов или e2e тестов ● Запуск тестов производится параллельно ● Для каждого Jest worker’a создается своя sqlite база данных. ● Для каждого Jest worker’a поднимается инстанс сервера на рандомном порту. ● Перед каждым тестом очищаются данные в БД.
  • 13. Тестирование npm test Структура папки с тестами: Envs - кастомное окружение для поднятия сервера Expectations - вынесены проверки с использованием expect.objectContaining Factories - папка с фабриками для создания той или иной сущности в БД с использованием faker.js. Mutations/Queries - объявления запросов и мутаций
  • 14. Тестирование npm test Фабрика для создания одиночной сущности User
  • 15. Тестирование npm test ● Фабрика для создания нескольких сущностей User ● Задействуется фабрика для создания одиночной сущности User
  • 16. Тестирование npm test Пример из папки expectations При этом в ответе могут содержаться другие поля (locations) и так далее, но expect.objectContaining позволяет проверить только нужные поля и их контент, expect.arrayContaining позволяет пройтись по массиву объектов и выполнить проверки для каждого объекта в массиве
  • 18. Тестирование npm test Пример очистки БД с использованием средств Sequelize ORM
  • 19. GraphQL Security ● Что ожидает тех кто связался с graphql ○ В основном это различного вида DDoS (отказ в обслуживании) ● Как достигается? ○ Отправкой серверу данных огромного размера ○ Создание запросов заставляющих вернуть огромное кол-во данных (что занимает значительные ресурсы сервера). Манипуляция параметрами пагинации. ○ Запросы с большой вложенностью (путем рекурсивного обращения к зависимостям)
  • 20. GraphQL Security ● Как бороться? ○ Проверка длины входного запроса и в случае превышения лимита не передавать его на парсинг. this.app.use('*', this.queryLengthLimiter);
  • 21. GraphQL Security Проверкой глубины вложенности npm пакет graphql-depth-limit const depthLimit = require('graphql-depth-limit');
  • 23. GraphQL Security С использованием пакета graphql-cost-analysis для анализа веса запроса const costAnalysis = require('graphql-cost-analysis').default;
  • 26. GraphQL Security Использовать Custom Scalar Types для установки лимитов при валидации параметров запроса (пагинация)
  • 27. GraphQL Security С использованием пакета graphql-input-number
  • 28. GraphQL Security Принцип белого листа возможных легитимных запросов Используется библиотека persistgraphql { "scripts": { "postbuild": "persistgraphql src api/query-whitelist.json" } } if (!whitelist[query]) { throw new Error('Query is not in whitelist.'); }
  • 29. GraphQL Security {"query getUserById($id: Int!) {n user(id: $id) {n cursorn node {n idn namen emailn role {n idn namen }n }n }n}n":1}
  • 30. Новые возможности В основном реализованы на клиенте и это верно, так как клиент более функционален чем бекенд в наше время. И тем более что все чаще приходят к BaaS, Serverless архитектуре. Это появление <Query>, <Mutation>, <Subscription> компонентов в react- apollo, которые теперь учитывают жизненный цикл реакт компонента и намного упрощают тестирование и запрос данных.