Настройка OIDC-провайдера аутентификации
Конфигурация OIDC-провайдера
Чтобы настроить OIDC-провайдер (OpenID Connect), создайте конфигурацию с необходимыми параметрами для подключения к OIDC-серверу и маппинга пользовательских атрибутов.
Процесс аутентификации
- Пользователь выбирает OIDC-провайдер на странице входа.
- Система перенаправляет пользователя на страницу аутентификации OIDC-провайдера.
- После успешной аутентификации OIDC-провайдер перенаправляет пользователя обратно в систему с кодом авторизации. В endpoint
{UI_APP_ENDPOINT}/auth/callback/oidc. - Система обменивает код авторизации на токены доступа и ID-токен.
- Система запрашивает дополнительную информацию через userinfo endpoint.
- Система создает или обновляет пользователя в базе данных, назначает роли и группы на основе информации из userinfo.
- Система создает сессию для пользователя и перенаправляет его на главную страницу.
Основные параметры конфигурации
{
slug: 'keycloak', // Уникальный идентификатор провайдера
title: 'Keycloak', // Отображаемое название провайдера
type: 'oidc', // Тип провайдера (должен быть 'oidc')
defaultRole: 'datalens.visitor', // Роль по умолчанию для новых пользователей
config: {
// Параметры подключения к OIDC-серверу
issuer: 'https://keycloak.example.org/realms/datalens-enterprise/.well-known/openid-configuration', // URL OIDC-сервера
clientId: 'datalens', // Идентификатор клиента
clientSecret: 'password', // Секрет клиента
codeChallengeMethod: 'S256', // Метод PKCE (Proof Key for Code Exchange)
scope: ['openid', 'profile', 'email', 'roles', 'groups'], // Запрашиваемые области доступа
// Маппинг атрибутов пользователя (опционально)
userAttributes: {
userId: 'sub', // Атрибут для идентификатора пользователя (по умолчанию 'sub')
login: 'preferred_username', // Атрибут для логина пользователя (по умолчанию 'preferred_username')
email: 'email', // Атрибут для адреса электронной почты пользователя (по умолчанию 'email')
firstName: 'given_name', // Атрибут для имени пользователя (по умолчанию 'given_name')
lastName: 'family_name', // Атрибут для фамилии пользователя (по умолчанию 'family_name')
},
// Настройка ролей (опционально)
roles: {
path: 'resource_access.datalens.roles', // Путь к ролям в userinfo
targetType: 'array-of-strings', // Тип данных ролей
mapping: {
'datalens.admin': 'client.datalens.admin', // Маппинг ролей
'datalens.creator': 'client.datalens.creator', // Маппинг ролей
'datalens.visitor': 'client.datalens.visitor', // Маппинг ролей
},
},
syncUserRoles: true, // Синхронизировать роли пользователя при каждом входе
// Настройка групп (опционально)
groups: {
path: 'groups', // Путь к группам в userinfo
targetType: 'array-of-objects', // Тип данных групп
mapping: { // Маппинг атрибутов группы (только для 'array-of-objects')
groupId: 'id', // Атрибут для идентификатора группы
title: 'name', // Атрибут для названия группы
},
},
syncUserGroups: true, // Синхронизировать группы пользователя при каждом входе
}
}
Детальное описание параметров
Основные параметры
- slug — уникальный идентификатор провайдера, используется в URL и внутренних идентификаторах.
- title — название провайдера, отображаемое в интерфейсе.
- type — тип провайдера, для OIDC должно быть значение
oidc. - defaultRole — роль, назначаемая пользователю, если не удалось определить роль из userinfo.
Параметры подключения к OIDC-серверу
- issuer — URL OIDC-сервера, который предоставляет метаданные OpenID Connect. Обычно это URL с путем к
.well-known/openid-configuration. - clientId — Идентификатор клиента, полученный при регистрации приложения в OIDC-провайдере.
- clientSecret — Секрет клиента, полученный при регистрации приложения в OIDC-провайдере.
- codeChallengeMethod — Метод PKCE (Proof Key for Code Exchange) для защиты от атак перехвата кода авторизации. По умолчанию
S256. Если передатьnull, то авторизация будет выполняться сstateиnonceбез PKCE. - scope — Массив запрашиваемых областей доступа. По умолчанию:
['openid', 'profile', 'email'].
Маппинг атрибутов пользователя
Позволяет настроить соответствие между атрибутами пользователя OIDC и полями пользователя в системе:
- userId — атрибут для идентификатора пользователя (по умолчанию
sub). - login — атрибут для логина пользователя (по умолчанию
preferred_username). - email — атрибут для адреса электронной почты пользователя (по умолчанию
email). - firstName — атрибут для имени пользователя (по умолчанию
given_name). - lastName — атрибут для фамилии пользователя (по умолчанию
family_name).
Настройка ролей
Позволяет настроить получение и маппинг ролей пользователя из userinfo:
-
path — путь к ролям в userinfo. Например,
resource_access.datalens.rolesилиrealm_access.roles. -
targetType — тип данных ролей. Возможные значения:
array-of-strings— массив строк.stringified-array-of-strings— строка, содержащая сериализованный JSON-массив строк.
-
mapping — объект, сопоставляющий роли в системе с ролями в userinfo.
Настройка групп
Позволяет настроить получение и маппинг групп пользователя из userinfo:
-
path — путь к группам в userinfo. Например,
groups. -
targetType — тип данных групп. Возможные значения:
array-of-strings— массив строк, где каждая строка — идентификатор группы.array-of-strings-with-id— массив строк, где каждая строка имеет форматid:title.array-of-objects— массив объектов, содержащих идентификатор и название группы.stringified-array-of-strings— строка, содержащая сериализованный JSON-массив строк.stringified-array-of-strings-with-id— строка, содержащая сериализованный JSON-массив строк с форматомid:title.stringified-array-of-objects— строка, содержащая сериализованный JSON-массив объектов.
-
mapping — объект, определяющий, какие поля объекта группы использовать для идентификатора и названия группы. Обязателен для типов
array-of-objectsиstringified-array-of-objects.- groupId — поле объекта группы, используемое как идентификатор.
- title — поле объекта группы, используемое как название.
Дополнительные настройки
- syncUserRoles — при значении
true(по умолчанию) роли пользователя будут синхронизироваться при каждом входе. - syncUserGroups — при значении
true(по умолчаниюfalse) группы пользователя будут синхронизироваться при каждом входе.
Особенности синхронизации ролей и групп
Синхронизация групп и ролей пользователя происходит в момент входа пользователя в систему. Если в userinfo присутствуют роли или группы, указанные в конфигурации, они будут назначены пользователю. Если роли не найдены, пользователю будет назначена роль по умолчанию.
Пример конфигурации для Keycloak
const keycloakConfig = {
slug: 'keycloak',
title: 'Keycloak',
type: 'oidc',
defaultRole: 'datalens.visitor',
config: {
issuer: 'https://keycloak.example.org/realms/datalens-enterprise/.well-known/openid-configuration',
clientId: 'datalens',
clientSecret: 'password',
codeChallengeMethod: 'S256',
scope: ['openid', 'profile', 'email', 'roles', 'groups'],
roles: {
path: 'resource_access.datalens.roles',
targetType: 'array-of-strings',
mapping: {
'datalens.admin': 'client.datalens.admin',
'datalens.creator': 'client.datalens.creator',
},
},
syncUserRoles: true,
groups: {
path: 'groups',
targetType: 'array-of-strings', // Рекомендуем настроить Script Mapper и использовать array-of-objects для указания идентификатора и названия группы
},
syncUserGroups: true,
},
};
Настройка клиента Keycloak
Для примера задайте конфигурацию клиента Keycloak:
-
Укажите настройки клиента, для этого нажмите
Clients→ ваш клиент (datalens) →Settings:-
Valid redirect URIs:
{UI_APP_ENDPOINT}/auth/callback/oidc. ЗаменитеUI_APP_ENDPOINTна URL вашего приложения, напримерhttp://example.com:8080/auth/callback/oidc. -
Client authentication —
on. -
Authentication flow —
Standard flow.
-
-
Чтобы создать роли, нажмите
Clients→ ваш клиент (datalens) →Roles:client.datalens.adminclient.datalens.creator
-
Чтобы создать группу, нажмите
Groups→Create group. -
Чтобы назначить группу и роли пользователю, нажмите
Users→пользователь:- Назначьте роли на вкладке
Role mapping. - Назначьте группу на вкладке
Groups.
- Назначьте роли на вкладке
-
Чтобы настроить scope клиента, нажмите
Client scopes→Create client scope:- Создайте scope
groupsи mapper typeGroup Membership. ВключитеAdd to userinfoв настройках Keycloak. - Создайте scope
rolesили predefined mapperclient roles. ВключитеAdd to userinfoв настройках Keycloak.
- Создайте scope
Пример userinfo для Keycloak
{
"sub": "4d2b6d80-49cf-44fb-94c6-946393dea8c7",
"resource_access": {
"datalens": {
"roles": [
"client.datalens.creator"
]
},
},
"email_verified": true,
"name": "Bob Smith",
"groups": [
"datalens-admin"
],
"preferred_username": "bob",
"given_name": "Bob",
"family_name": "Smith",
"email": "bob@example.org"
}
Использование конфигурации
Настройка через переменную окружения AUTH_PROVIDERS_CONFIG
Для настройки провайдеров аутентификации в приложении используется переменная окружения AUTH_PROVIDERS_CONFIG. Эта переменная содержит JSON-строку с массивом конфигураций всех провайдеров аутентификации.
Пример значения переменной окружения AUTH_PROVIDERS_CONFIG:
[
{
"slug": "keycloak",
"title": "Keycloak",
"type": "oidc",
"defaultRole": "datalens.visitor",
"config": {
"issuer": "https://keycloak.example.org/realms/datalens-enterprise/.well-known/openid-configuration",
"clientId": "datalens",
"clientSecret": "password",
"codeChallengeMethod": "S256",
"scope": ["openid", "profile", "email", "roles", "groups"],
"roles": {
"path": "resource_access.datalens.roles",
"targetType": "array-of-strings",
"mapping": {
"datalens.admin": "client.datalens.admin",
"datalens.creator": "client.datalens.creator"
}
},
"syncUserRoles": true,
"groups": {
"path": "groups",
"targetType": "array-of-strings"
},
"syncUserGroups": true
}
}
]