Настройка OIDC-провайдера аутентификации

Конфигурация OIDC-провайдера

Чтобы настроить OIDC-провайдер (OpenID Connect), создайте конфигурацию с необходимыми параметрами для подключения к OIDC-серверу и маппинга пользовательских атрибутов.

Процесс аутентификации

  1. Пользователь выбирает OIDC-провайдер на странице входа.
  2. Система перенаправляет пользователя на страницу аутентификации OIDC-провайдера.
  3. После успешной аутентификации OIDC-провайдер перенаправляет пользователя обратно в систему с кодом авторизации. В endpoint {UI_APP_ENDPOINT}/auth/callback/oidc.
  4. Система обменивает код авторизации на токены доступа и ID-токен.
  5. Система запрашивает дополнительную информацию через userinfo endpoint.
  6. Система создает или обновляет пользователя в базе данных, назначает роли и группы на основе информации из userinfo.
  7. Система создает сессию для пользователя и перенаправляет его на главную страницу.

Основные параметры конфигурации

{
            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:

  1. Укажите настройки клиента, для этого нажмите Clients → ваш клиент (datalens) → Settings:

    • Valid redirect URIs: {UI_APP_ENDPOINT}/auth/callback/oidc. Замените UI_APP_ENDPOINT на URL вашего приложения, например http://example.com:8080/auth/callback/oidc.

    • Client authenticationon.

    • Authentication flowStandard flow.

  2. Чтобы создать роли, нажмите Clients → ваш клиент (datalens) → Roles:

    • client.datalens.admin
    • client.datalens.creator
  3. Чтобы создать группу, нажмите GroupsCreate group.

  4. Чтобы назначить группу и роли пользователю, нажмите Usersпользователь:

    • Назначьте роли на вкладке Role mapping.
    • Назначьте группу на вкладке Groups.
  5. Чтобы настроить scope клиента, нажмите Client scopesCreate client scope:

    • Создайте scope groups и mapper type Group Membership. Включите Add to userinfo в настройках Keycloak.
    • Создайте scope roles или predefined mapper client roles. Включите Add to userinfo в настройках Keycloak.

Пример 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
            }
          }
        ]