Deworker Pro
1.41K subscribers
5 photos
187 links
Download Telegram
После формы регистрации осталось добавить вход в кабинет и восстановление пароля.

Для этого перед программированием нам нужно определиться, как мы будем осуществлять аутентификацию в приложении из JS-фронтенда и API.

Как раз сегодня рассмотрим практики аутентификации по токенам при работе с API и сравним классические подходы с использованием токенов в формате JWT.

И смоделируем по шагам процесс получения и обновления токенов по универсальной спецификации OAuth2, чтобы с нашим API могли работать сторонние клиенты.
Мы с вами активно подключали сторонние компоненты, но в их исходники не заглядывали и код не анализировали. Пора это исправить :)

Для этого открываем обещанную ранее новую рубрику практического рефакторинга, где это будем делать.

Сегодня проведём разбор кода компонента OAuth 2.0 Server, который как раз будем использовать для аутентификации на бэкенде.

Сделаем форк репозитория и настроим локальный запуск тестов для проверки кода перед коммитом и отправкой Pull Request.

Займёмся упрощением кода сервера. Найдём и устраним избыточность интерфейса ответа. Удалим неиспользуемые аргументы. Увидим неудобство наличия сеттеров в сервисе и рассмотрим способы избавления от них. Избавимся от зависимости от конкретного класса путём добавления интерфейса для внедрения публичного ключа. И сделаем интерфейсы компактными.
Подвезли новые релизы:

Сегодня обновим CS Fixer, переведём Doctrine ORM на использование PSR-6 для кэширования мета-информации, сделаем более безопасным Jenkinsfile и доустановим в образ Jenkins компилятор Rust для сборки зависимостей.
Приступаем к реализации полноценной системы аутентификации на бэкенде.

Сегодня исследуем работу готового компонента League OAuth2 Server и проинтегрируем его в наш PHP-проект. Напишем требуемые сущности и репозитории по интерфейсам компонента. Добавим сохранение авторизационного кода и токена обновления через Doctrine.

Помимо этого обновим Docker-образы и напишем свою функцию env для более удобной работы с переменными окружения.
Продолжаем интеграцию.

Когда у нас готовы сущности и репозитории создадим сам компонент OAuth-сервера. Для него сгенерируем файлы ключей и сделаем их деплой из Jenkins через Docker Secrets.

Сделаем страницу входа и контроллер для генерации и обновления токенов. Все контроллеры покроем функциональными тестами.

По аналогии с Command добавим Query-модель на DBAL для выполнения запросов на чтение данных из модуля.

И заодно рассмотрим, как можно избавиться от вызова синглтона SentrySDK в коде наших сервисов и экшенов.
После добавления полноценной генерации токенов пришла пора эти JWT-токены принимать и валидировать. И извлекать из них идентификатор пользователя для использования в контроллере.

Для этого создадим компонент сервера ресурсов. Добавим middleware для аутентификации и рассмотрим несколько вариантов его написания и использования.
Сегодня завершаем аутентификацию для бэкенда. Доделаем нюансы, не реализованные ранее.

Сначала добавим роль в JWT. Потом напишем генератор токенов для E2E тестов. И сделаем форсированное разлогинивание пользователя и автоочистку устаревших кодов из БД по Cron в Docker Swarm.
При реализации аутентификации мы познакомились с использованием секретов Docker для передачи контейнерам файлов ключей для JWT.

По этим же мотивам сегодня мы повысим безопасность контейнеров. Сделаем передачу паролей через секреты вместо переменных окружения. И создадим отдельного пользователя для PHP-CLI, чтобы не запускать консольные команды от root. Это нам станет полезно когда мы добавим очереди.

Заодно обновим виртуальные машины до Debian 10 и Docker 20, чтобы работать со свежими инструментами.
При появлении в базе данных реальных записей возникает вопрос надёжности их хранения и резервного копирования, чтобы их случайно не потерять.

Об этом сегодня и позаботимся.

Сравним варианты запуска PostgreSQL в Docker, нативно и как облачный сервис. Рассмотрим, как сделать репликацию при запуске в Docker. И напишем скрипт резервного копирования БД с загрузкой дампа в S3-совместимое хранилище.

И для удобства поднимем эмулятор хранилища для локальной разработки.
Стрим нового рабочего сезона

Спасибо за ваши предложения по контенту в комментариях и в обратную связь! С вами мы делаем наши видео лучше, чем изначально планировали.

Открываем новый рабочий сезон. Об этом поговорим с вами на стриме в эту пятницу 20 августа в 19:00 МСК.
В нашей инфраструктуре есть неудобства. В отличие от доменов и поддоменов при разработке и тестировании мы используем маршрутизацию по портам. При тестировании мы используем домен gateway вместо localhost. Все поддомены нам приходится вписывать вручную. И из-за монополии на 80 и 443 порты кластера мы не можем задеплоить несколько проектов.

Сегодня мы всё это решим. И от Nginx и Certbot перейдём на декларативное управление доменными именами и проксированием с помощью Traefik с автополучением Let's Encrypt сертификатов. И как бонус вынесем прокси-сервер в отдельный репозиторий, чтобы можно было деплоить в один кластер сколько угодно проектов
Борода у меня не такая уж длинная, но в поиске будущую возрастную нишу уже занимаем. Готовь, так сказать, сани с молоду 😄
Как и обещали в стриме, начинаем перезапись старых эпизодов.

Сегодня выкладываем обновлённое видео про жизненный цикл HTTP-запроса. Изменили стиль, улучшили качество и доработали часть про DNS.
Продолжаем делать контент лучше и удобнее. Сегодня рассмотрим структуру запроса и ответа с хостами, ресурсами, методами и статусами. Поговорим про идемпотентность запросов, о которой не все знают.
Помимо записи новых эпизодов и переписывания старых для удобства просмотра дописываем тайм-коды к имеющимся. Сегодня добавили их к эпизоду о подключении БД и установке Doctrine ORM.
Вы уже познакомились с деятельностью Юли на прошлом стриме. Её любовь к систематизации и классификации в дополнение к нашей программистской безбашенности было решено направить в нужное русло. Посему она возьмёт штурвал проектирования ТЗ и дизайна аукциона в свои скрупулёзные руки пока мы с вами пишем код. И всё это подробно расскажет и покажет в своей серии о проектировании. Занимайте места ближе к экрану и поехали вместе :)
С типом аукциона мы с вами определились. Сегодня начинаем рисовать. Подсмотрим несколько идей у других готовых аукционов и набросаем структуру главной страницы.
Начинаем делать свой удобный HTTP-фреймворк на PHP. От нас не скроется ни один нюанс его работы. Мы исследуем его устройство вдоль и поперёк через написание с нуля каждого компонента.

Сегодня в начале нашего пути дадим определение компонентного HTTP-фреймворка. Рассмотрим место фреймворка и библиотек в потоке управления. Встретим и решим проблему совместимости фреймворков путём использования рекомендаций PSR.

Заваривайте себе тёплого чая и поехали вместе с нами!