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

# С чего всё началось

У нас есть внутренний сервис, доступ к которому сотрудник должен получить только после обязательного обучения. 

В компании работает больше 1500 человек, поэтому проверять прохождение курса вручную - не вариант. Постоянно обновлять таблицу со статусами тоже не хотелось: её нужно вести, перепроверять и следить, чтобы никто не потерялся. 

Кроме самого доступа, сотруднику нужно отправить письмо: сообщить, что сервис уже доступен, дать ссылку и коротко объяснить, как начать работу.

Для единого входа в корпоративные сервисы мы используем **Keycloak**, а весь процесс решили собрать в **n8n**.

# Как устроена автоматизация

Сценарий получился довольно простым:

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/clQsxema.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/clQsxema.png" alt="asd.webp"></a></p>

После завершения обучения всё происходит автоматически, без ручной выдачи доступов.

# 1. Следим за входящими письмами

Информация о прохождении курса приходит на почту, поэтому сценарий начинается с нода **Email Trigger (IMAP)**. 

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/aimap.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/aimap.png" alt="asd.webp"></a></p>

Почтовый аккаунт подключаем через **Credentials**. В нашем случае используется mail.ru, поэтому для n8n мы создали отдельный пароль для внешнего приложения. Основной пароль от почты лучше нигде в автоматизациях не использовать.

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/kredy.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/kredy.png" alt="asd.webp"></a></p>

**Важный момент:** В настройках триггера отключите автоматическую отметку писем как прочитанных. Нод срабатывает на каждое новое письмо. Если оставить эту настройку включённой, n8n будет читать письма за вас, а потом можно долго удивляться, почему во входящих нет непрочитанных сообщений.

# 2. Отбираем только нужные письма

Email Trigger получает все входящие письма, а нам нужны только уведомления об успешном прохождении курса.

Для фильтрации используем стандартный нод **IF**. В нашем случае достаточно проверить:

- отправителя;
- тему письма.

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/if-polnyi.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/if-polnyi.png" alt="asd.webp"></a></p>

Нужные поля можно просто перетащить из входного 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`.

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/get-token.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/get-token.png" alt="asd.webp"></a></p>

В ответ Keycloak возвращает access token. Он понадобится во всех следующих запросах.

# 4. Ищем сотрудника по почте

Из письма берём адрес сотрудника, который прошёл обучение, и ищем его в Keycloak.

Снова используем **HTTP Request**:

- метод — `GET`;
- адрес — `https://{DNS или IP Keycloak}/admin/realms/{Realm}/users`;
- почта передаётся в query-параметрах;
- access token передаётся в заголовке авторизации.

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/get-user.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/get-user.png" alt="asd.webp"></a></p>

В ответ получаем данные сотрудника и его внутренний идентификатор. Именно по этому идентификатору дальше будет назначаться роль.

# 5. Получаем нужную роль

Вход в сервис зависит от роли в Keycloak. Поэтому перед назначением нужно получить саму роль через API.

Используем ещё одну ноду **HTTP Request**:

- метод — `GET`;
- адрес — `https://{DNS или IP Keycloak}/admin/realms/{Realm}/roles/{ID роли}`;
- название роли указываем в URL;
- access token передаём в заголовке авторизации.

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/get-role.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/get-role.png" alt="asd.webp"></a></p>

В ответ получаем объект роли с её идентификатором и названием.

# 6. Назначаем роль сотруднику

На этом этапе у нас уже есть всё необходимое:

- сотрудник;
- его идентификатор в Keycloak;
- нужная роль;
- access token.

Остаётся отправить запрос на назначение роли:

- метод — `POST`;
- адрес — `https://{DNS или IP Keycloak}/admin/realms/{Realm}/users/{{ $('Get user').item.json.id }}/role-mappings/realm`;
- access token передаётся в заголовке;
- объект роли передаётся в `Body`.

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/set-role.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/set-role.png" alt="asd.webp"></a></p>

После успешного запроса сотрудник получает доступ к сервису.

# 7. Отправляем письмо сотруднику

После выдачи доступа важно сразу сообщить об этом сотруднику.

Для отправки используем стандартную ноду **Send Email**. SMTP-подключение, как и остальные учётные данные, настраиваем через **Credentials**.

Письмо формируем в HTML и добавляем в него:

- сообщение об открытии доступа;
- ссылку на сервис;
- короткую инструкцию по входу;
- описание основных возможностей;
- ссылку на документацию;
- контакт для вопросов.

<p id="bkmrk-"><a href="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/send-email.png" target="_blank" rel="noopener"><img class="align-center" src="https://wiki.marksdigital.ru/uploads/images/gallery/2026-09/scaled-1680-/send-email.png" alt="asd.webp"></a></p>

В итоге сотрудник не просто получает роль в 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 без разработки отдельного приложения. Теперь сотрудник получает доступ сразу после прохождения курса, а следом ему автоматически приходит письмо со ссылкой и инструкцией.