Роль в 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 - Обзор результата
Скрытый контент
Комментарии (34)
Руслан

Спасибо!

Ответить
Arunas

Спасибо! :)

Ответить
Подскажите пожалуйста после запуска docker-compose и обращении к странице выдает ошибку

Добрый день, подскажите пожалуйста. С вчерашнего дня перестали собираться образы 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.

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

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

Google
Yandex
MailRu