Синхронизация пользователей из службы каталогов
Jazz Sync Tool — приложение для синхронизации пользователей из вашей службы каталогов, совместимой с протоколом LDAP (например, Microsoft Active Directory) в SaluteJazz.
После синхронизации новые пользователи доступны в кабинете администратора. При синхронизации удаленные из службы каталогов пользователи автоматически удаляются из кабинета администратора.
Совместимость и требования
Основное требование — совместимость с Go версии 1.22.
- Операционная система:
- Windows 10 и выше/Server 2016 и выше;
- из семейства Linux, с версией ядра 2.6.32 и выше;
- из семейства macOS 10.15 Catalina и новее.
- LDAP-совместимая реализация службы каталогов. Актуальные совместимые версии:
- OpenLDAP: версия 2.4 и выше;
- Active Directory: совместимая с Windows 10 и выше или Server 2016 и выше.
- Сетевой доступ (
ldap: TCP/UDP) между сервером, на котором запускается приложение, и сервером, на котором установлена служба каталогов. - Сетевой доступ (
http) между сервером, на котором запускается приложение, иsalutejazz.ru. - Личный кабинет Jazz Cloud c активным проектом. Убедитесь, что для вашей учетной записи доступна вкладка SSO и на ней доступна генерация Secret.
- Актуальная версия приложения доступна по ссылке в личном кабинете Jazz Cloud.
Использование и описание приложения
Схема работы:
- Администратор запрашивает Secret в личном кабинете Studio .
- Studio отдает Secret.
- Администратор запускает приложение и передает ему параметры.
- Утилита отправляет запрос на получение токена авторизации (для этого используется Secret, который заказчик получает в личном кабинете Studio).
- Studio передает токен в ответе на запрос.
- Утилита авторизуется в LDAP-хранилище и запрашивает список пользователей.
- Утилита получает список пользователей из LDAP-хранилища.
- Утилита запрашивает список групп из LDAP-хранилища.
- Утилита получает список групп из LDAP-хранилища.
- Утилита сохраняет структуру групп локально.
- Утилита отправляет запрос, чтобы инициировать старт синка.
- Платформа проверяет активность проекта.
- Утилита получает в ответ на запрос идентификатор запущенного синка.
- Утилита отправляет список пользователей на платформу.
- Утилита получает ответ от платформы.
- Утилита инициирует завершение синка.
- Утилита получает ответ от платформы.
- Утилита запрашивает статус синка.
- Утилита получает статус синка от платформы.
Флаги и параметры запуска
Формат запуска (cmd/bash)
NAME:
sync.exe - ldap to cloud user sync app
USAGE:
sync.exe [global options] command [command options]
DESCRIPTION:
ldap user sync
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--ldap value ldap connection strings
--sync-mode value sync mode
--batch-size value (default: 50)
--dry-run (default: false)
--ldap-debug (default: false)
--secret value
--client-id value
--ldap-id value
--log-level value (default: "info")
--log-format value (default: "text")
--cert-path value
--key-path value
--ca-path value
--help, -h show help
--version, -v print only the version (default: false)
Описание параметров запуска
| Параметр | Описание | Валидации |
|---|---|---|
--help | Справка по командам | |
--ldap | Строка, в которой переданы все атрибуты для подключения к отдельной AD. Описание атрибутов и структуры параметров ldap — ниже. Утилита подключается только к одному источнику | --ldap(s) — это url, в котором нужно экранирование спецсимволов |
--sync-mode | Режим синхронизации | Возможные значения: full, diff |
--batch-size | Максимальный размер батча | |
--ldap-debug | Включение логирования запросов к AD | |
--client-id | Идентификатор проекта (Studio) | Соответствует project_id |
--ldap-id | Идентификатор ресурса. Задается заказчиком при запуске утилиты. Передается для каждого пользователя в параметре reg_source. Должен быть задан атрибутом в интеграционной записи, если используется IDP | |
--secret | Секрет клиента. Требуется заранее подать заявку в Studio на доступ к странице с secret | |
--ca-path | Путь к сертификату. При использовании шифрованного протокола необходимо указать протокол ldaps в параметре connectionURL | Используется отдельно от --cert-path и --key-path |
--cert-path | Путь к сертификату при использовании приватного ключа --key-path. При использовании шифрованного протокола необходимо указать протокол ldaps в параметре connectionURL | Используются только в паре |
--key-path | Приватный ключ к сертификату из --cert-path. При использовании шифрованного протокола необходимо указать протокол ldaps в параметре connectionURL | |
--log-level | Настройка уровня логирования, debug — подробные логи, info — только предупреждения/ошибки. По умолчанию info | --log-level=error--log-level=warning--log-level=info--log-level=debug |
--log-format | Формат вывода логов - текст или JSON-объект. По умолчанию text | log-format=jsonbr />log-format=text |
--version | Выводит версию приложения |
Пример запуска приложения
Пример запуска по протоколу LDAP
sync-v1.0.0-6-win-x64.exe --ldap="connectionURL=ldap://10.129.17.10:389&bindDN=adread@jazz.local&usersDN=OU=Employees,DC=jazz,DC=local&groupsDN=OU=EmployeesGroups,DC=jazz,DC=local&protocol=LDAP&bindPassword=sPXavwjq6&uniqueAttribute=objectGUID&importAttributes=middleName:middleName,memberOf:group&groupAttribute=group&filter=((objectClass=user))&groupFilter=((objectClass=group))&searchScope=20&paging=1000&vendor=MSAD&emailAttribute=mail&givenNameAttribute=givenName&surnameAttribute=sn" --sync-mode="full" --secret="1e1ef82c-2be1-4b53-bad6-6ef3f9a8b522" --client-id="019b467a-d093-7c78-892e-2f66c421bfa6" --ldap-id="fd09e5c5-95e8-4162-b7c3-5420e4eb8d7d" --log-level="debug" --log-format="json"
Пример запуска по протоколу LDAPS
sync-v1.0.0-6-win-x64.exe --ldap="connectionURL=ldaps://10.129.17.10:636&bindDN=adread@jazz.local&usersDN=OU=Employees,DC=jazz,DC=local&groupsDN=OU=EmployeesGroups,DC=jazz,DC=local&protocol=LDAP&bindPassword=sPXavwjq6&uniqueAttribute=objectGUID&importAttributes=middleName:middleName,memberOf:group&groupAttribute=group&filter=((objectClass=user))&groupFilter=((objectClass=group))&searchScope=20&paging=1000&vendor=MSAD&emailAttribute=mail&givenNameAttribute=givenName&surnameAttribute=sn" --sync-mode="full" --secret="1e1ef82c-2be1-4b53-bad6-6ef3f9a8b522" --client-id="019b467a-d093-7c78-892e-2f66c421bfa6" --ldap-id="fd09e5c5-95e8-4162-b7c3-5420e4eb8d7d" --log-level="debug" --log-format="json" --cert-path=/path/to/cert.cert --key-path=/path/to/cert.key
Получение данных из службы каталогов
Для подключения к службе каталогов нужны параметры сервера, параметры каталогов и параметры пользователя с доступом на чтение к службе каталогов. Полный перечень в таблице параметров подключения к LDAP ниже.
Обратите внима ние, что значения параметров должны быть экранированы с помощью urlencode, прежде чем объединены через &.
| Параметр | Описание | Пример | Обязательный |
|---|---|---|---|
| Атрибуты подключения к LDAP | |||
protocol | Протокол взаимодействия. Поддерживаются протоколы: LDAP | protocol=LDAP | Нет |
connectionURL | Адрес подключения к LDAP-серверу. Есть возможность указать порт. По умолчанию LDAP использует порт 389, а LDAPS — порт 636. В зависимости от выбранного протокола содержит ldap:// или ldaps:// | connectionURL=ldap://10.212.32.3:389 connectionURL=ldaps://10.212.32.3:636 | Да |
bindDN | Учетная запись администратора. DN — «уникальное имя» — адрес в каталоге, определяющий учетную запись. Например: cn=ldap-sync,cn=test-user,dc=customer-01,dc=lab,dc=s2b,dc=tech означает, что используется учетная запись юзера ldap-sync из каталога test-user на сервере customer-01.lab.s2b.tech | bindDN=Administrator@customer-01.lab.s2b.tech | Да |
bindPassword | Пароль администратора | bindPassword={password} | Да |
vendor | Тип реализации каталога LDAP, к которому подключается утилита. По умолчанию MSAD | vendor=OTHER | Нет. Возможные значения: MSAD, OTHER |
| Атрибуты синхронизации пользователей | |||
usersDN | Полное DN дерева LDAP, в котором находятся пользователи (дерево, которое является родительским для пользователей LDAP). Например, 'ou=users,dc=example, dc=com', для пользователя 'uid='john',ou=users,dc=example,dc=com&. Можно передать несколько userDN | usersDN=CN=test-user,DC=customer-01,DC=lab,DC=s2b,DC=tech | Да |
groupDN | Полное DN дерева LDAP, в котором находятся группы (дерево, которое является родительским для групп LDAP). Например, 'ou=users,dc=example, dc=com', для пользователя 'uid='john',ou=users,dc=example,dc=com. Можно передать несколько groupDN | groupDN=OU=EmployeesGroups,DC=jazz,DC=local | Нет |
emailAttributte | Всегда принимает значение из атрибута, в котором содержится email. Например, из атрибута mail | emailAttribute | Да |
givenNameAttributte | Атрибут, который содержит имя | givenNameAttribute=givenName | Да |
surnameAttribute | Атрибут, который содержит фамилию | surnameAttribute=cn | Нет |
importAttributes | Импортируемые из службы каталогов в Keycloak параметры, парами через запятую. Первое значение из пары — параметр AD, второе — соответствующий атрибут Keycloak. Все пары значений атрибутов LDAP objectClass для пользователей в LDAP, разделенные запятыми | importAttributes=inetOrgPerson:inn, organizationalPerson:age | Нет |
platformAttributes | Служебные атрибуты, обрабатываются платформой не задаются заказчиком. Сейчас не используются | Ключ-значение, через запятую | Нет |
uniqueAttribute | Уникальный идентификатор длиной 16 байт в формате GUID. Атрибут, который обеспечивает уникальность пользователя в Active Directory. Имя атрибута LDAP, который используется в качестве уникального идентификатора объекта (UUID) для объектов в LDAP. Для Active Directory это должно быть значение "objectGUID". Для поставщиков серверов LDAP это значение "entryUUID" | uniqueAttribute=objectGUID | Да |
filter | Дополнительный фильтр LDAP для фильтрации пользователей. Должно начинаться со скобки "(" и заканчивается скобкой ")" | filter=((objectClass=*)) | Да |
searchScope | Количество уровне й каталога, которые нужно обойти для поиска пользователей. 1 — только текущий уровень, 2 — текущий уровень и все его поддеревья | searchScope=2 | Да |
paging | Максимальный размер порции данных при запросе из AD. Положительное целое число | paging=1000 | Да |
groupFilter | Дополнительный фильтр LDAP для фильтрации групп. Должно начинаться со скобки "(" и заканчивается скобкой ")" | groupFilter=((objectClass=group)) | Да |
Отправка данных на сервер платформы
Ниже опи сание процесс взаимодействия с платформой: получение авторизационных данных, отправку данных на сервер, типы синхронизации (полная и частичная) и алгоритмы их выполнения. Здесь подробно изложены шаги отправки данных, включая инициализацию передачи, обработку ошибок и завершение работы утилиты.
Подключение к платформе
- Получение авторизационных данных в личном кабинете Studio.
- Взаимодействие с платформой, с использованием полученного из Studio токена.
Отправка данных
- Данные отправляются порционно. Подробнее — в разделе REST API:
- Первый запрос инициирует передачу данных.
- Второй и следующие запросы передают данные.
- Последним выполняется запрос, завершающий отправку.
- Запрос статуса обработки у платформы.
- Отдает статус обработки и ошибки, если при обработке произошли ошибки.
- Отдает статус обработки (в процессе/завершена).
- При неуспешной отправке, после нескольких повторных попыток. Утилита прекращает синк и сообщает об ошибке.
- Завершение работы.
Типы синхронизации
- Полная синхронизация: сопоставляются все записи в платформе и AD, лишние удаляются из user service. Из Keycloak учетные записи не удаляются, только деактивируются.
- Частичная синхронизация: система получает данные об изменениях пользователя, групп пользователей.
- Обновляются только пользователи, которые менялись с момента последней частичной синхронизации (в том числе те, у которых менялось членство в группе).
- Создаются новые пользователи, если они появились с момента последней частичной синхронизации.
То, какой синк произойдет — полный или частичный, задается при запуске приложения. При первом запуске приложения должна быть задана полная синхронизация.
Алгоритм полной синхронизации (утилита)
- Утилита запрашивает данные из LDAP-хранилища:
- Из всех указанных userDN, с учетом фильтров в параметре filter.
- Из всех указанных groupDN, с учетом фильтров в параметре groupFilter.
- Утилита составляет иерархию групп и пользователей-членов этих групп и сохраняет ее локально.
- Для каждого пользователя в customAttributes передаются как группы, в которых непосредственно состоит пользовтель, так и их родительские группы.
- Время окончания успешной синхронизации добавляется в конфигурационный файл приложения.
Алгоритм частичной синхронизации (утилита)
- Утилита проверяет, была ли произведена полная синхронизация. Если полной синхронизации не было, утилита сообщает о необходимости ее запуска.
- Утилита запрашивает данные из LDAP-хранилища:
- Изменения пользователей из всех указанных userDN, с учетом фильтров в параметре filter.
- Изменения групп из всех указанных groupDN, с учетом фильтров в параметре groupFilter.
- Утилита составляет иерархию групп и пользователей-членов этих групп и сохраняет ее локально.
- Пользователи, которые менялись с момента последнего синка, частями передаются в платформу. Подробнее — в разделе Отправка данных:
- Для каждого пользователя в customAttributes передаю тся как группы, в которых непосредственно состоит пользователь, так и их родительские группы.
- Если хотя бы один из запросов не выполнен или на него получен неуспешный ответ, обработка завершается.
- Время окончания успешной синхронизации добавляется в конфигурационный файл приложения.
Фильтр LDAP для частичной синхронизации: пользователи
(&(whenChanged>=20250811144901.0Z)({cmd.input.ldap.filter}))
Утилита собирает данные об изменениях в cлужбе каталогов, используя фильтры LDAP. Название поля, по которому фильтруются данные, зависит от вендора:
- Для LDAP MS Active Directory используется атрибут
whenChanged. - Для остальных реализаций LDAP используется атрибут
modifyTimeStamp.
Состав фильтра:
whenChanged/modifyTimeStamp.- Дата изменения, с которой нужно сверять синк (максимальная дата изменения из предыдущего синка).
{cmd.input.ldap.filter}- фильтр, передаваемый в утилите при запуске (полеfilterстрокиldap). Например,(&(objectClass=*)).
При запуске из командной строки фильтр имеет вид (%26(objectClass=group)). Это экранирование, которое требуется в командной строке.
Фильтр LDAP для частичной и полной синхронизации: группы
{cmd.input.ldap.groupFilter}
Утилита собирает данные о всех группах в службе каталогов, используя фильтры LDAP.
Состав фильтра: REST AP {cmd.input.ldap.groupFilter} — фильтр, передаваемый в утилите при запуске (поле groupFilter строки ldap). Например, (objectClass=group).
Завершение работы утилиты
При завершении итерации утилита возвращает код.
| Код завершения | Описание кода | Описание кейса |
|---|---|---|
| 0 | Успешное завершение работы | Успех. Итерация завершена без ошибок и предупреждений |
| 1 | Завершение работы с ошибкой | Ошибка проведения синка |
| 2 | Частично успешное завершение работы (не все записи созданы/обновлены/удалены) | Обработана часть записей, детальная информация в логах |
| 4 | Ошибка подключения к службе каталогов | Проверьте сетевую доступность службы каталогов и настройки подключения к ней |
| 5 | Ошибка при работе с пользователями | Записи не обработаны, детальная информация в логах |
| 10 | Завершение работы: не найдена/истекла лицензия | Необходимо проверить лицензию проекта |
Журналирование работы утилиты
Запись логов ведется в файлt logs, который расположен в том же каталоге, что и утилита. Для каждого синка создается отдельный log-файл.
Утилита не очищает логи автоматически.
Настройка логирования. Содержимое файла настраивается параметрами, которые приведены в разделе Описание параметров запуска.
- Параметр
--log-formatпозволяет выбрать между текстовым и JSON-представлением логов. - Параметр
--ldap-debugвключает логирование запросов между Jazz Sync Tool и cлужбой rаталогов. - Параметр
--log-levelпозволяет настроить вывод как подробной, так и сжатой информации о том, как прошла итерация.
Пример логов с заданным уровнем info
2025-07-17T17:01:32+03:00 info application version: v1.0.0-8-mac-x64 run_id:ca82330b-b3af-41c1-8577-d8751a117a06
2025-07-17T17:01:32+03:00 info begin fetch auth token
2025-07-17T17:01:32+03:00 info end fetch auth token successfully
2025-07-17T17:01:32+03:00 info begin full sync
2025-07-17T17:01:32+03:00 info begin fetch LDAP users: connectionURL=**********************************
2025-07-17T17:01:32+03:00 info end fetch LDAP users successfully. 1 users fetched
2025-07-17T17:01:32+03:00 info begin init sync
2025-07-17T17:01:32+03:00 info end init sync successfully
2025-07-17T17:01:32+03:00 info begin upload user chunk #1 size 1
2025-07-17T17:01:32+03:00 info end upload user chunk #1 successfully
2025-07-17T17:01:32+03:00 info begin finish sync
2025-07-17T17:01:32+03:00 info end finish sync successfully
2025-07-17T17:01:32+03:00 info begin waiting sync competition
2025-07-17T17:01:37+03:00 info end waiting sync competition successfully
2025-07-17T17:01:37+03:00 info sync done. users created: 0, updated: 1, deleted: 0. failed entry: <none>, action: <none>
Пример логов с заданным уровнем debug
2025-07-17T17:02:50+03:00 info begin fetch auth token
2025-07-17T17:02:50+03:00 debug sending http request {"protocol": "http", "from": "cmd", "request_id": "a4c899b5-94f2-47ff-ba0f-3f47f3744983" , "method": "POST", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/authsd/api/v2/oauth", "headers": {"Authorization":["Basic YWY1MGQ4YjctNmY****************************************************************wLWY3MjQ1OGI0N2NkMA=="],"Content-Type":["application/x-www-form-urlencoded"],"Rquid":["a4c899b5-94f2-47ff-ba0f-3f47f3744983"],"X-Request-Id":["a4c899b5-94f2-47ff-ba0f-3f47f3744983"],"X-Request-Origin":["cmd"]}}
2025-07-17T17:02:50+03:00 debug successfully sent http request {"protocol": "http", "from": "cmd", "request_id": "a4c899b5-94f2-47ff-ba0f-3f47f3744983" , "method": "POST", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/authsd/api/v2/oauth", "response": "{\"access_token\":\"eyJjdHkiOiJqd3QiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.fqQeylU24_RLQvNpgCbvtXX1FdUP6k22rAIe5_XSHtxGfPjBmL9f3WN34fAxToAqIqElswFby8C_ceaPj2ewp05bzOBo3-xMLXcB7nzu6fvU0K2XHvR-igGw5GnlUhvnDyMxSl9FHzI3mcdqTGgRMRrQl4rewKIQUgIoQJcp_SLhvAAR4a3**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************NnxuYTCRO5rc3pRRQ6Bi0yq_vc_wWPG3jLBiX-YE7VdUIQn-HJehSb8i5Dh21UP2Lzk7ivTO3ExbT7BGoi3PjAMGwb07jlLivDYoxKa_Yr3Nk_DQVaXirLJKvFokbWj_MErsbgyE6EUMle_bIS3LeDiIJ4C19tXwkf0Ep11sR7fyzB_uQ5EEQtdDGPHaIbTM1xzIt2sd7TzfowlSbIw.O-JuGPTghO8GMhX1vmsiOsTeWywqiwQTspnb20fbwnM\",\"expires_at\":1752764570853}", "response_code": 200, "response_status": "OK", "headers": null}
2025-07-17T17:02:50+03:00 info end fetch auth token successfully
2025-07-17T17:02:50+03:00 info begin full sync
2025-07-17T17:02:50+03:00 info begin fetch LDAP users: connectionURL=****************************************
2025-07-17T17:02:50+03:00 info end fetch LDAP users successfully. 1 users fetched
2025-07-17T17:02:50+03:00 info begin init sync
2025-07-17T17:02:50+03:00 debug sending http request {"protocol": "http", "from": "cmd", "request_id": "d2945b9f-dd2c-40ff-a3f3-68ada1fbda58" , "method": "POST", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/init", "headers": {"Authorization":["eyJjdHkiOiJqd3QiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.fqQeylU24_RLQvNpgCbvtXX1FdUP6k22rAIe5_XSHtxGfPjBmL9f3WN34fAxToAqIqElswFby8C_ceaPj2ewp05bzOBo3-xMLXcB7nzu6fvU0K2XHvR-igGw5GnlUhvnDyMxSl9FHzI3mcdqTGgRMRrQl4rewKIQUgIoQJcp_SLhvAAR4a3**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************NnxuYTCRO5rc3pRRQ6Bi0yq_vc_wWPG3jLBiX-YE7VdUIQn-HJehSb8i5Dh21UP2Lzk7ivTO3ExbT7BGoi3PjAMGwb07jlLivDYoxKa_Yr3Nk_DQVaXirLJKvFokbWj_MErsbgyE6EUMle_bIS3LeDiIJ4C19tXwkf0Ep11sR7fyzB_uQ5EEQtdDGPHaIbTM1xzIt2sd7TzfowlSbIw.O-JuGPTghO8GMhX1vmsiOsTeWywqiwQTspnb20fbwnM"],"Content-Type":["application/json"],"X-Request-Id":["d2945b9f-dd2c-40ff-a3f3-68ada1fbda58"],"X-Request-Origin":["cmd"]}, "request": "{\"full\":true}"}
2025-07-17T17:02:50+03:00 debug successfully sent http request {"protocol": "http", "from": "cmd", "request_id": "d2945b9f-dd2c-40ff-a3f3-68ada1fbda58" , "method": "POST", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/init", "response": "{\"id\":\"20250717140250_a71af0ba-ea77-4cbf-ac2f-f1d7752d532b_full_sync\"}", "response_code": 200, "response_status": "OK", "headers": null}
2025-07-17T17:02:50+03:00 info end init sync successfully
2025-07-17T17:02:50+03:00 info begin upload user chunk #1 size 1
2025-07-17T17:02:50+03:00 debug sending http request {"protocol": "http", "from": "cmd", "request_id": "b2ed673d-dcdc-4053-b971-f092d067fed3" , "method": "POST", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/upload", "headers": {"Authorization":["eyJjdHkiOiJqd3QiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.fqQeylU24_RLQvNpgCbvtXX1FdUP6k22rAIe5_XSHtxGfPjBmL9f3WN34fAxToAqIqElswFby8C_ceaPj2ewp05bzOBo3-xMLXcB7nzu6fvU0K2XHvR-igGw5GnlUhvnDyMxSl9FHzI3mcdqTGgRMRrQl4rewKIQUgIoQJcp_SLhvAAR4a3**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************NnxuYTCRO5rc3pRRQ6Bi0yq_vc_wWPG3jLBiX-YE7VdUIQn-HJehSb8i5Dh21UP2Lzk7ivTO3ExbT7BGoi3PjAMGwb07jlLivDYoxKa_Yr3Nk_DQVaXirLJKvFokbWj_MErsbgyE6EUMle_bIS3LeDiIJ4C19tXwkf0Ep11sR7fyzB_uQ5EEQtdDGPHaIbTM1xzIt2sd7TzfowlSbIw.O-JuGPTghO8GMhX1vmsiOsTeWywqiwQTspnb20fbwnM"],"Content-Type":["application/json"],"X-Request-Id":["b2ed673d-dcdc-4053-b971-f092d067fed3"],"X-Request-Origin":["cmd"]}, "request": "{\"id\":\"20250717140250_a71af0ba-ea77-4cbf-ac2f-f1d7752d532b_full_sync\",\"users\":[{\"email\":\"e2@e.com\",\"firstName\":\"f\",\"lastName\":\"l\",\"uuid\":\"1335307c-c474-4c8a-8603-a4000f8ef3a5\",\"customAttributes\":{},\"platformAttributes\":{},\"regSource\":\"777\"}]}"}
2025-07-17T17:02:51+03:00 debug successfully sent http request {"protocol": "http", "from": "cmd", "request_id": "b2ed673d-dcdc-4053-b971-f092d067fed3" , "method": "POST", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/upload", "response_code": 200, "response_status": "OK", "headers": null}
2025-07-17T17:02:51+03:00 info end upload user chunk #1 successfully
2025-07-17T17:02:51+03:00 info begin finish sync
2025-07-17T17:02:51+03:00 debug sending http request {"protocol": "http", "from": "cmd", "request_id": "9bc15ab2-b869-4a31-8aef-d48f901e8a44" , "method": "POST", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/finish", "headers": {"Authorization":["eyJjdHkiOiJqd3QiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.fqQeylU24_RLQvNpgCbvtXX1FdUP6k22rAIe5_XSHtxGfPjBmL9f3WN34fAxToAqIqElswFby8C_ceaPj2ewp05bzOBo3-xMLXcB7nzu6fvU0K2XHvR-igGw5GnlUhvnDyMxSl9FHzI3mcdqTGgRMRrQl4rewKIQUgIoQJcp_SLhvAAR4a3**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************NnxuYTCRO5rc3pRRQ6Bi0yq_vc_wWPG3jLBiX-YE7VdUIQn-HJehSb8i5Dh21UP2Lzk7ivTO3ExbT7BGoi3PjAMGwb07jlLivDYoxKa_Yr3Nk_DQVaXirLJKvFokbWj_MErsbgyE6EUMle_bIS3LeDiIJ4C19tXwkf0Ep11sR7fyzB_uQ5EEQtdDGPHaIbTM1xzIt2sd7TzfowlSbIw.O-JuGPTghO8GMhX1vmsiOsTeWywqiwQTspnb20fbwnM"],"Content-Type":["application/json"],"X-Request-Id":["9bc15ab2-b869-4a31-8aef-d48f901e8a44"],"X-Request-Origin":["cmd"]}, "request": "{\"id\":\"20250717140250_a71af0ba-ea77-4cbf-ac2f-f1d7752d532b_full_sync\"}"}
2025-07-17T17:02:51+03:00 debug successfully sent http request {"protocol": "http", "from": "cmd", "request_id": "9bc15ab2-b869-4a31-8aef-d48f901e8a44" , "method": "POST", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/finish", "response_code": 200, "response_status": "OK", "headers": null}
2025-07-17T17:02:51+03:00 info end finish sync successfully
2025-07-17T17:02:51+03:00 info begin waiting sync competition
2025-07-17T17:02:51+03:00 debug sending http request {"protocol": "http", "from": "cmd", "request_id": "9a10f7e3-8242-47a9-9feb-c9f313eb8fe4" , "method": "GET", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/20250717140250_a71af0ba-ea77-4cbf-ac2f-f1d7752d532b_full_sync/status", "headers": {"Authorization":["eyJjdHkiOiJqd3QiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.fqQeylU24_RLQvNpgCbvtXX1FdUP6k22rAIe5_XSHtxGfPjBmL9f3WN34fAxToAqIqElswFby8C_ceaPj2ewp05bzOBo3-xMLXcB7nzu6fvU0K2XHvR-igGw5GnlUhvnDyMxSl9FHzI3mcdqTGgRMRrQl4rewKIQUgIoQJcp_SLhvAAR4a3**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************NnxuYTCRO5rc3pRRQ6Bi0yq_vc_wWPG3jLBiX-YE7VdUIQn-HJehSb8i5Dh21UP2Lzk7ivTO3ExbT7BGoi3PjAMGwb07jlLivDYoxKa_Yr3Nk_DQVaXirLJKvFokbWj_MErsbgyE6EUMle_bIS3LeDiIJ4C19tXwkf0Ep11sR7fyzB_uQ5EEQtdDGPHaIbTM1xzIt2sd7TzfowlSbIw.O-JuGPTghO8GMhX1vmsiOsTeWywqiwQTspnb20fbwnM"],"Content-Type":["application/json"],"X-Request-Id":["9a10f7e3-8242-47a9-9feb-c9f313eb8fe4"],"X-Request-Origin":["cmd"]}}
2025-07-17T17:02:51+03:00 debug successfully sent http request {"protocol": "http", "from": "cmd", "request_id": "9a10f7e3-8242-47a9-9feb-c9f313eb8fe4" , "method": "GET", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/20250717140250_a71af0ba-ea77-4cbf-ac2f-f1d7752d532b_full_sync/status", "response": "{\"errors\":\"\",\"done\":false}", "response_code": 200, "response_status": "OK", "headers": null}
2025-07-17T17:02:56+03:00 debug sending http request {"protocol": "http", "from": "cmd", "request_id": "1109c473-183d-4f00-b242-c8b532563bd3" , "method": "GET", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/20250717140250_a71af0ba-ea77-4cbf-ac2f-f1d7752d532b_full_sync/status", "headers": {"Authorization":["eyJjdHkiOiJqd3QiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.fqQeylU24_RLQvNpgCbvtXX1FdUP6k22rAIe5_XSHtxGfPjBmL9f3WN34fAxToAqIqElswFby8C_ceaPj2ewp05bzOBo3-xMLXcB7nzu6fvU0K2XHvR-igGw5GnlUhvnDyMxSl9FHzI3mcdqTGgRMRrQl4rewKIQUgIoQJcp_SLhvAAR4a3**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************NnxuYTCRO5rc3pRRQ6Bi0yq_vc_wWPG3jLBiX-YE7VdUIQn-HJehSb8i5Dh21UP2Lzk7ivTO3ExbT7BGoi3PjAMGwb07jlLivDYoxKa_Yr3Nk_DQVaXirLJKvFokbWj_MErsbgyE6EUMle_bIS3LeDiIJ4C19tXwkf0Ep11sR7fyzB_uQ5EEQtdDGPHaIbTM1xzIt2sd7TzfowlSbIw.O-JuGPTghO8GMhX1vmsiOsTeWywqiwQTspnb20fbwnM"],"Content-Type":["application/json"],"X-Request-Id":["1109c473-183d-4f00-b242-c8b532563bd3"],"X-Request-Origin":["cmd"]}}
2025-07-17T17:02:56+03:00 debug successfully sent http request {"protocol": "http", "from": "cmd", "request_id": "1109c473-183d-4f00-b242-c8b532563bd3" , "method": "GET", "trace_id": "00000000000000000000000000000000", "endpoint": "https://example.com", "path": "/sync/20250717140250_a71af0ba-ea77-4cbf-ac2f-f1d7752d532b_full_sync/status", "response": "{\"errors\":\"\",\"done\":true,\"stat\":{\"updateCount\":1,\"createCount\":0,\"deleteCount\":0,\"failedEmail\":\"\",\"failedAction\":\"\"}}", "response_code": 200, "response_status": "OK", "headers": null}
2025-07-17T17:02:56+03:00 info end waiting sync competition successfully
2025-07-17T17:02:56+03:00 info sync done. users created: 0, updated: 1, deleted: 0. failed entry: <none>, action: <none>
Сводные данные об итерации в логах
После завершения итерации синхронизации Jazz Sync Tool выводит сводные данные о количестве созданных, измененных и удаленных пользователей.
{"log_level":"info","date":"2026-01-19T17:11:22+03:00","message":"sync completed without warnings. Duration: 50.221617ms","run_id":"9dfe4dab-608f-4a57-9060-e3cd21048b26"}
{"log_level":"info","date":"2026-01-19T17:11:22+03:00","message":"users created: 0","run_id":"9dfe4dab-608f-4a57-9060-e3cd21048b26"}
{"log_level":"info","date":"2026-01-19T17:11:22+03:00","message":"users updated: 0","run_id":"9dfe4dab-608f-4a57-9060-e3cd21048b26"}
{"log_level":"info","date":"2026-01-19T17:11:22+03:00","message":"users deleted: 0","run_id":"9dfe4dab-608f-4a57-9060-e3cd21048b26"}
Данные об ошибке в логах
В случае ошибки, в параметре errors будет указана операция, при выполнении которой произошла ошибка (создание, изменение, удаление), и email пользователей, при обработке которых произошла ошибка.
REST API
REST API использует Jazz Sync Tool для подключения к платформе по умолчанию и приведена для ознакомительных целей.
- Авториз ация выполняется по токену.
- Токен передается в хедере Authorization.
- Токен получает администратор приложения Jazz Sync Tool в личном кабинете Studio.
Подробнее — в разделе SaluteJazz Sync Tool REST API.