Перейти к основному контенту

Как автоматизировать выдачу доступа после обучения с помощью n8n и Keycloak

С чего всё началось

У нас есть внутренний сервис, доступ к которому сотрудник должен получить только после обязательного обучения.

В компании работает больше 1500 человек, поэтому проверять прохождение курса вручную - не вариант. Постоянно обновлять таблицу со статусами тоже не хотелось: её нужно вести, перепроверять и следить, чтобы никто не потерялся.

Кроме самого доступа, сотруднику нужно отправить письмо: сообщить, что сервис уже доступен, дать ссылку и коротко объяснить, как начать работу.

Для единого входа в корпоративные сервисы мы используем Keycloak, а весь процесс решили собрать в n8n.

Как устроена автоматизация

Сценарий получился довольно простым:

asd.webp

После завершения обучения всё происходит автоматически, без ручной выдачи доступов.

1. Следим за входящими письмами

Информация о прохождении курса приходит на почту, поэтому сценарий начинается с нода Email Trigger (IMAP).

asd.webp

Почтовый аккаунт подключаем через Credentials. В нашем случае используется mail.ru, поэтому для n8n мы создали отдельный пароль для внешнего приложения. Основной пароль от почты лучше нигде в автоматизациях не использовать.

asd.webp

Важный момент: В настройках триггера отключите автоматическую отметку писем как прочитанных. Нод срабатывает на каждое новое письмо. Если оставить эту настройку включённой, n8n будет читать письма за вас, а потом можно долго удивляться, почему во входящих нет непрочитанных сообщений.

2. Отбираем только нужные письма

Email Trigger получает все входящие письма, а нам нужны только уведомления об успешном прохождении курса.

Для фильтрации используем стандартный нод IF. В нашем случае достаточно проверить:

  • отправителя;
  • тему письма.

asd.webp

Нужные поля можно просто перетащить из входного JSON в условия нода. Когда проверка сложнее, можно использовать выражения n8n или JavaScript.

По основной ветке сценарий идёт дальше только в том случае, если письмо подходит под заданные условия.

3. Получаем токен Keycloak

Дальше начинается работа с Keycloak.

В нужном Realm создаём отдельный клиент для n8n и выдаём ему права, которых достаточно для поиска сотрудников и назначения ролей. Лишние права такому клиенту не нужны.

Данные клиента и остальные секреты сохраняем в Credentials, а не пишем прямо внутри workflow.

Для получения access token используем нод HTTP Request:

  • метод — POST;
  • адрес — https://{DNS или IP Keycloak}/realms/{Realm}/protocol/openid-connect/token;
  • данные клиента передаются в Body.

asd.webp

В ответ Keycloak возвращает access token. Он понадобится во всех следующих запросах.

4. Ищем сотрудника по почте

Из письма берём адрес сотрудника, который прошёл обучение, и ищем его в Keycloak.

Снова используем HTTP Request:

  • метод — GET;
  • адрес — https://{DNS или IP Keycloak}/admin/realms/{Realm}/users;
  • почта передаётся в query-параметрах;
  • access token передаётся в заголовке авторизации.

asd.webp

В ответ получаем данные сотрудника и его внутренний идентификатор. Именно по этому идентификатору дальше будет назначаться роль.

5. Получаем нужную роль

Вход в сервис зависит от роли в Keycloak. Поэтому перед назначением нужно получить саму роль через API.

Используем ещё одну ноду HTTP Request:

  • метод — GET;
  • адрес — https://{DNS или IP Keycloak}/admin/realms/{Realm}/roles/{ID роли};
  • название роли указываем в URL;
  • access token передаём в заголовке авторизации.

asd.webp

В ответ получаем объект роли с её идентификатором и названием.

6. Назначаем роль сотруднику

На этом этапе у нас уже есть всё необходимое:

  • сотрудник;
  • его идентификатор в Keycloak;
  • нужная роль;
  • access token.

Остаётся отправить запрос на назначение роли:

  • метод — POST;
  • адрес — https://{DNS или IP Keycloak}/admin/realms/{Realm}/users/{{ $('Get user').item.json.id }}/role-mappings/realm;
  • access token передаётся в заголовке;
  • объект роли передаётся в Body.

asd.webp

После успешного запроса сотрудник получает доступ к сервису.

7. Отправляем письмо сотруднику

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

Для отправки используем стандартную ноду Send Email. SMTP-подключение, как и остальные учётные данные, настраиваем через Credentials.

Письмо формируем в HTML и добавляем в него:

  • сообщение об открытии доступа;
  • ссылку на сервис;
  • короткую инструкцию по входу;
  • описание основных возможностей;
  • ссылку на документацию;
  • контакт для вопросов.

asd.webp

В итоге сотрудник не просто получает роль в Keycloak, а сразу понимает, куда заходить и что делать дальше.

Почему мы не стали делать отдельный сервис

Для всей автоматизации понадобились стандартные ноды n8n и четыре запроса к Keycloak:

  1. получить access token;
  2. найти сотрудника;
  3. получить роль;
  4. назначить роль.

Поднимать ради этого отдельный сервис было бы избыточно. n8n позволил быстро собрать рабочий процесс и связать почту, систему обучения и Keycloak в одном месте.

Теперь сценарий выглядит так:

  1. сотрудник проходит курс;
  2. система обучения отправляет письмо;
  3. n8n проверяет уведомление;
  4. Keycloak назначает роль;
  5. сотрудник получает письмо с инструкцией.

Никаких ручных таблиц, проверок списков и отдельных запросов на выдачу доступа.

Что стоит учесть при работе с n8n

  1. Отключайте автоматическое чтение писем. Это небольшая настройка, про которую легко забыть. Но если n8n работает с вашей основной почтой, она быстро становится заметной.

  2. Собирайте ноды в единый сценарий. У нас большой опыт работы с Dynamo, поэтому поначалу хотелось переносить знакомую логику и в n8n. Но это другой инструмент. Не стоит оставлять ноды отдельно от основного потока, даже если кажется, что им не нужны данные предыдущего шага. У workflow должно быть понятное начало и последовательный маршрут выполнения.

  3. Подписывайте публикации и изменения. При каждой публикации workflow оставляйте короткий комментарий: что поменяли и зачем.. Это похоже на комментарии к коммитам в Git. Когда сценарий начнёт развиваться, такие заметки сильно упростят поиск нужной версии и разбор изменений.

  4. Не храните секреты внутри workflow. Пароли, client secret, SMTP-настройки, токены и другие закрытые данные должны лежать в Credentials. В самом workflow секретной информации быть не должно.

  5. Используйте ИИ как помощника. Когда опыта с n8n ещё мало, ИИ хорошо помогает быстрее разобраться в платформе. С его помощью можно подобрать нужный нод под задачу, разобраться в данных и логике сценария, настроить запросы и выражения, написать код и найти ошибки. Но запросы, которые работают с доступами и ролями, всё равно нужно внимательно проверять перед запуском.

  6. Проверяйте готовые community nodes. У n8n большое сообщество, и многие интеграции уже реализованы в виде пользовательских нодов. Перед тем как писать сложную логику самостоятельно, стоит посмотреть, нет ли готового решения. При этом важно проверить автора пакета, активность проекта и то, какие данные и разрешения он использует. Для простых и важных интеграций стандартный нод HTTP Request часто остаётся самым понятным и контролируемым вариантом.

Итог

Мы связали почту, систему обучения и Keycloak без разработки отдельного приложения. Теперь сотрудник получает доступ сразу после прохождения курса, а следом ему автоматически приходит письмо со ссылкой и инструкцией.