Задонатить и смотреть →
Открой безлимитный доступ к 100+ полезных скринкастов и получай скидки на все предстоящие мероприятия

Роль в JWT и Cron в Docker Swarm

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

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

  • 00:00:20 - Постановка задачи
  • 00:04:05 - Добавление роли в JWT токен
  • 00:10:10 - Получение роли из модуля Auth
  • 00:14:06 - Извлечение роли из токена
  • 00:23:42 - Генерация токенов для E2E тестов
  • 00:30:11 - Рефакторинг генератора
  • 00:35:01 - Форсированное разлогинивание
  • 00:36:27 - Удаление устаревших кодов
  • 00:38:54 - Запуск по Cron в Docker Swarm
  • 00:44:17 - Переводы для HTTP-шаблонов
  • 00:47:09 - Перевод по фразам и ключам
  • 00:52:58 - Вынос папки валидатора
  • 00:54:24 - Обзор результата
Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (36)
Руслан

Спасибо!

Ответить
Arunas

Спасибо! :)

Ответить
Pavel N

Добрый день, подскажите пожалуйста. С вчерашнего дня перестали собираться образы php-cli-alpine и php-fpm-alpine. Выдает ошибку

make: /bin/sh: Operation not permitted make: *** [Makefile:209: pdo_pgsql.lo] Error 127

Такая ошибка есть в обсуждении alpine но, как ее решить так и не понял. ubuntu - 20 docker - version 19.03.12, docker-compose version 1.26.2.

Подскажите как можно решить эту проблем ку.

Ответить
Руслан

Попробовал все пересобрать на Mac (Docker: v.20.10.7, Compose: v.2.0.0-b6) - полет норм.

Возможно не связано с вашей ошибкой, но сборка могла упасть из-за обновления :latest версии базового образа на docker hub, также на прошлой неделе наткнулся что старая версия образа была полностью удалена из реестра. Попробуйте собрать с другой версией базового образа.

Ответить
Дмитрий Елисеев

Обновите Docker до версии 20.

Ответить
slo_nik

Добрый вечер.

А как это правильно сделать?

Есть playbook upgrade, но после запуска версия docker не обновляется. ОС Debian 10

Ответить
Дмитрий Елисеев

Проверьте имя дистрибутива в /etc/apt/sources.list.d/docker.list

Должен быть buster, как мы сделали в следующем эпизоде.

Ответить
slo_nik

Поменял в upgrade.yml, в файл docker.list добавилась строка

deb [arch=amd64] https://download.docker.com/linux/debian buster latest

Но и старые строки остались. Это может вызвать конфликт в будущем?

Ответить
Дмитрий Елисеев

Конфликта не будет. Но можно удалить.

Ответить
slo_nik

Благодарю.

Ответить
slo_nik

Добрый день, Дмитирий.

Не совсем понятно со сменой роли пользователя.

Как я понял, если админ меняет роль для пользователя, то пользователь какое-то время ещё пользуется старой ролью.

Почему в этом случае не разлогинивать пользователя принудительно?

Ответить
Дмитрий Елисеев

Потому что без хождения в БД при валидации нет возможности разлогинить JWT принудительно.

Ответить
slo_nik

Получается, что пока пользователь не обратиться к БД - ничего не будет?

Ответить
Дмитрий Елисеев

В этом суть JWT вместо токенов в БД, что в JWT токену мы всегда верим на слово.

В принимающем коде мы в токене с {user_id, role, expires, sign} проверяем только подпись и срок. Если подпись сошлась срок не истёк, то токен рабочий.

Поэтому у нас чисто физически нет способа "разлогинить" уже выданный конкретный JWT токен.

Ответить
slo_nik

Добрый день.

Подскажите, как в api правильно оформить запрос к контроллеру, который отвечает за авторизацию через социальные сети?

И, если есть api контроллеры, но нет смысла оставлять старую web-авторизацию?

Ответить
Дмитрий Елисеев

Можно через серию редиректов вроде:

frontend > api/authorize/fb > facebook > api/callback/fb > frontend

То есть в API сделать контроллер, который редиректит на соцсеть. И с фронтенда редиректить на него вроде api/authorize/fb?state=xyz. Потом при возврате из соцсети на callback-контроллер в нём добавлять пользователя и уже как обычно редиректить с одноразовым кодом authorization_code обратно на фронтенд.

Ответить
slo_nik

Вопрос не совсем в тему.

Подскажите, в каком эпизоде Вы объясняете CORS заголовки для config ngix?

Я имею ввид это

Ответить
Дмитрий Елисеев

Сами заголовки объясняю в отдельной серии по HTTP.

Ответить
slo_nik

А в этих видео Вы нигде дополнительно не объясняете?

Ответить
Дмитрий Елисеев

Просто добавляем их в 50-ом эпизоде.

Ответить
slo_nik

Благодарю.

И ещё вопрос не в тему)

У меня проблема с functional тестами, при проверке api контроллера, регистрация. Тест не проходит, так как идёт отправка уведомления пользователю.

Как отключить в тестах отправку уведомлений?

Где-то, в Ваших видео, говорилось об этом, но никак не могу найти)

Ответить
Дмитрий Елисеев

Не отключать, а просто отправлять письма в mailhog.

Ответить
slo_nik

На локальном так и есть, тесты проходят.

Но при try-testing из всех именно этот тест отваливается.

public function testSuccess(): void
{
    $this->client->request('POST', self::URI, [], [], ['CONTENT_TYPE' => 'application/json'], json_encode([
        'first_name' => 'Jon',
        'last_name' => 'Do',
        'email' => 'signup@test.com',
        'password' => 'password',
    ]));

    self::assertEquals(201, $this->client->getResponse()->getStatusCode());
    self::assertJson($content = $this->client->getResponse()->getContent());

    $data = json_decode($content, true);

    self::assertEquals(['Check your email.'], $data);
}
Ответить
slo_nik

Хотя в .env.test я определил env переменные для mail

MAILER_URL=smtp://mailer:1025
MAILER_FROM_EMAIL=test@test.com
MAILER_FROM_NAME=test
Ответить
slo_nik

Пока не совсем понял, как добавить пользователя и одноразовый код authorization?

Callback-контроллер нужно указать в настройках самого facebook?

Ответить
Дмитрий Елисеев

Пока не совсем понял, как добавить пользователя и одноразовый код authorization?

В будущих эпизодах сделаем.

Callback-контроллер нужно указать в настройках самого facebook?

Да. В разделе разработчика у соцсети при добавлении oAuth приложения указываем обратный адрес для редиректа.

Ответить
slo_nik

В будущих эпизодах сделаем.

Эх...

Ну что же, будем ждать)

Ответить
slo_nik

В demo-manager Вы тоже используете jwt токены или там чуть другой подход?

Ответить
Дмитрий Елисеев

Для API там подключаем бандл trikoder/oauth2-bundle, который внутри использует этот же league/oauth2-server.

Ответить
slo_nik

Получается, что это те же jwt токены?

Сам бандл устарел. Как я понимаю, можно взять пример работы с токенами в этом проекте и подключить к проекту demo-manager?

Ответить
Дмитрий Елисеев

Да. Можно подсмотреть, как это было сделано в бандле.

Ответить
slo_nik

Благодарю за подсказки.

Ответить
slo_nik

Сейчас использую такой код для авторизации на сайте.

public function login(AuthenticationUtils $authenticationUtils): Response
{
    $error = $authenticationUtils->getLastAuthenticationError();
    $lastUser = $authenticationUtils->getLastUsername();

    return $this->render('app/auth/login.html.twig', ['last_username' => $lastUser, 'error' => $error]);
}

Как передать данные через api к этому действию я понимаю, но как теперь получить ответ, что пользователь авторизован или получить ошибки.

Код основан на Вашем примере из demo-manager.

Ответить
Михаил

я так понимаю валидацию формы входа не стали делать

Ответить
Дмитрий Елисеев

Можно при желании добавить валидацию email. Если для регистрации валидация критична, то для входа это малополезно.

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Google
GitHub
Yandex
MailRu