Интеграция с Keycloak
Настройка Keycloak
-
Настроить авторизацию в YuChat через Keycloak
-
Импортировать конфигурацию клиента для возможности авторизации с использованием KC.
Конфигурация: yuchat_web.json
-
На вкладке "General settings" → "Valid redirect URIs", "General settings" → "Valid post logout redirect URIs" https://yuchat.mycompany.com/*
- заменить на эндпоинт вашего сервера YuChat
-
-
Импортировать конфигурацию для возможности авторизации в консоли администратора с использованием KC.
Конфигурация: yuchat-dashboard.json
-
На вкладке "General settings" → "Valid redirect URIs", "General settings" → "Valid post logout redirect URIs" https://admin.yuchat.mycompany.com/*
- заменить на эндпоинт вашего сервера YuChat
-
-
Импортировать конфигурацию сервера для доступа backend YuChat в Keycloak.
Конфигурация: yuchat.json
-
На вкладке "Credentials":
- В разделе "Client Authenticator" установить значение "Client Id and Secret"
- В разделе "Client Secret" сгенерировать секрет и скопировать в конфигурацию backend YuChat (параметр "keycloak.clientSecret")
-
На вкладке "Service accounts roles":
- добавить роли "manage-events" и "manage-users"
-
-
Добавить ключ RSA для шифрования токенов пользователя
- Realm settings → Keys
- Скопировать Kid ключа RS256 (далее будет использоваться для параметра keycloak.sigKeyKid конфигурации сервера)
- Realm settings → Keys
-
-
Настроить синхронизацию с каталогом пользователей посредством протокола ldap
- Раздел "User federation" → "Add new provider" → "LDAP"
- В разделе "Connection and authentication settings" настроить параметры подключения по протоколу ldap к вашему каталогу
- В разделе "LDAP searching and updating" → "User DN" указать OU должен быть смигрирован в Keycloak
- В раделе "Advanced settings" → "Trust Email" установить значение в "On"
- На вкладке "Mappers" добавить маппинги для атрибутов пользователей (при необходимости)
- department = Департамент в YuChat
- position = Должность в YuChat
- phone = Номер телефона в YuChat
- displayName = Имя пользователя в YuChat
-
Настроить ttl для выдаваемых токенов
- Realm settings → Sessions → SSO Session Settings → SSO Session Idle → 5 days
- Realm settings → Sessions → SSO Session Settings → SSO Session Max → 10 days
- Realm settings → Tokens → Access tokens → Access Token Lifespan → 15 min
Настройка backend
-
Конфигурационные параметры для настройки подключе ния клиента к keycloak
yuchat:
client:
config:
supportedAuthTypes: "email,keycloak" #Добавить keycloak чтобы клиенты понимали что авторизация через keycloak доступна
keycloakUrl: "https://auth.yuchat.company.com" #Эндпоинт keycloak для доступа клиентов (в т.ч. снаружи)
keycloakRealm: "master" #Реалм keycloak с пользователями и конфигурацией
keycloakClientId: "yuchat_web" #ClientId настроенныый ранее -
Конфигурационные параметры для настройки подключения сервера к keycloak
keycloak:
enabled: true #Вкл/вкл интеграция с keycloak
serverUrl: https://auth.yuchat.company.com #Эндпоинт для доступа в keycloak с сервера
realm: master #Реалм keycloak с пользователями и конфигурацией
clientId: yuchat #ClientId для доступа backend в keycloak настроенныый ранее
clientSecret: "${KC_CLIENT_SECRET}" #Секрет сгенерированный ранее
sigKeyKid: "${KC_SIG_KEY_SECRET}" #Приватный ключ для подписи токенов сгенерированный ранее
Настройка синхронизации пользователей
Для настройки автоматической миграции пользователей из LDAP в YuChat с добавлением пользователей в команды небходимо изменить конфигурацию application.yml для сервиса backend.
user:
sync:
enabled: true #Вкл/выкл синхронизация с Keycloak
cron: "*/5 * * * *" #cron-expression расписания синхронизации
lockAtLeastFor: PT3M #системный параметр (не менее минимального времени синхронизации)
lockAtMostFor: PT6M #системный параметр (более максимального времени синхронизации)
defaultMapping: #Дополнительные настройки синхронизации (значения по умолчанию указаны ниже, не обязательно для заполнения)
DEPARTMENT: department #Подразделение
POSITION: position #Должность
PHONE: phone #Телефон
ENTRY_DN: entryDn #Поле в Keycloak, в котором будет содержаться OU LDAP, заданный выше
FULL_NAME: displayName #Поле в KC в котором будет содержаться полное имя пользователя, например Иван Иванович Иванов
orgUnits: #настройка обхектов синхронизации
- workspaceId: "d16wvhMJkm" #Id воркспейса, в который будут добавляться пользователи при синхронизации
ldapOU: "dc=company,dc=com" #Org unit ldap, из которого будут синхронизироваться пользователи
additionalMapping: #Дополнительные настройки синхронизации для переопределения маппинга в рамках отдельных org units (значения по умолчанию указаны ниже, не обязательно для заполнения)
DEPARTMENT: department #Подразделение
POSITION: position #Должность
PHONE: phone #Телефон
ENTRY_DN: entryDn #Поле в Keycloak, в котором будет содержаться OU LDAP, заданный выше
FULL_NAME: displayName #Поле в KC в котором будет содержаться полное имя пользователя, например Иван Иванович Иванов
updateExisted: false #Требуется ли обновлять аттрибуты пользователей при синхронизации в Keycloak
Синхронизация пользователей по департаментам
В YuChat предусмотрена возможность автоматизированной миграции пользователей в рабочие пространства по департаментам огранизации. Пример :
- Единое Глобальное рабочее пространство для всей организации
- Аккаунты пользователей в ADFS распределены по - Sales, Development, Management
- При создании нового аккаунта в ADFS пользователь должен автоматически добавится в рабочее пространство департамента в YuChat
Для реализации такой модели необходимо добавить несколько правил синхронизации для различных департаментов. Для миграции пользоватей в глобальное рабочее пространство можно использовать статический атрибут для всех пользователей из ADFS. В примере ниже атрибут company_label присвоен всем пользователям при миграции пользовалей из ADFS в Keycloak.
user:
sync:
enabled: true
cron: "*/1 * * * *"
lockAtLeastFor: PT1M
lockAtMostFor: PT2M
updateExisted: true
orgUnits:
- workspaceId: "d16wvhMJkm" #идентификатор Глобального рабочего пространства компании
ldapOU: "mycompany" #значение статического параметра company_label
updateExisted: true
additionalMapping:
ENTRY_DN: company_label #название аттрибута в Keycloak, в котором будет содержаться статический параметр mycompany
- workspaceId: "g3jqGXJF7Q" #id пространства департамента продаж
ldapOU: "CN=Sales,CN=Users,DC=yuchat,DC=fun" #имя группы Продаж в ADFS
updateExisted: true
additionalMapping:
ENTRY_DN: memberOf
- workspaceId: "h78uY3dLSi" #идентификатор пространства департамента Разработки
ldapOU: "CN=Development,CN=Users,DC=yuchat,DC=fun" #имя группы Разработки в ADFS
updateExisted: true
additionalMapping:
ENTRY_DN: memberOf
- workspaceId: "h8vM5Yysy0" #идентификатор пространства департамента Руководителей
ldapOU: "CN=Management,CN=Users,DC=yuchat,DC=fun" #имя группы Руководителей в ADFS
updateExisted: true
additionalMapping:
ENTRY_DN: memberOf
Часто в ADFS пользователям присвоено несколько групп, например у руководителей разработки в AD будут присутствовать группы Development и Management, и пользователи будет смигрированы в Глобальное рабочее пространство, Пространство департамента Разработки и пространство департамента Management
Использование дополнительных аттрибутов
В дополнении к миграции пользователей по департаментам в YuChat предусмотрена возможность использования дополнительных аттрибутов для более гранцулярной фильтрации пользователей в рабочие пространства.
Пример : в рамках департамента разработки CN=Development
существуют 2 команды разработки - iOS и Android. Необходимо автоматизированно добавлять разработчиков только из этих команд в отдельное рабочее пространство.
У всех разработчиков в ADFS нестроен аттрибут "dev_team", значения которых ios, android, web, server
user:
sync:
enabled: true
cron: "*/1 * * * *"
updateExisted: true
orgUnits:
- workspaceId: "h78uY3dLSi" #идентификатор пространства групп Мобильной разработки
ldapOU: "CN=Development,CN=Users,DC=yuchat,DC=fun" #имя группы Разработки в ADFS
updateExisted: true
additionalMapping:
ENTRY_DN: memberOf
filterAttributes:
- name: dev_team #общий аттрибут для всех команд разработки
value: ios #только iOS разработчикам присвоено значение ios в аттрибуте dev_team
eqType: LIKE #возможно использование EQ (точное соответствие) или LIKE (частичное совпадение в строке)
- workspaceId: "h78uY3dLSi" #идентификатор пространства групп Мобильной разработки
ldapOU: "CN=Development,CN=Users,DC=yuchat,DC=fun" #имя группы Разработки в ADFS
updateExisted: true
additionalMapping:
ENTRY_DN: memberOf
filterAttributes:
- name: dev_team
value: android
eqType: LIKE