﻿# Пользовательский модуль для двухфакторной аутентификации

> [HTML Version](two-factor-integration.html)

Вы можете включить двухэтапную аутентификацию при входе в систему или на [внешний портал](service-portal.md), чтобы в качестве второго фактора использовался код подтверждения. Пользователь получит этот код через сторонний сервис, например мессенджер. 

Для этого создайте [пользовательский модуль](extentions.md) и затем выберите его:

- в [настройках безопасности](security_settings.md#authorization), чтобы включить двухфакторную аутентификацию при входе в систему;

- в [настройках портала](portal-login-page.md#two-factor) на вкладке **Авторизация**, чтобы включить двухфакторную аутентификацию при входе на портал для внутренних пользователей.

````
начало внимание

````
Работать с модулями и настраивать их могут только пользователи, включённые в группу [Администраторы](360006871932.md#administrators).

````
конец внимание

````
Для примера настроим получение кода подтверждения через Telegram-бот, выполнив шаги:

1. Настроить получение кода из стороннего сервиса.

2. Создать и настроить модуль.

3. Включить модуль для второго фактора аутентификации.

## Шаг 1. Настроить получение кода из стороннего сервиса 

1. Перейдите в Telegram.

2. Создайте бота. Подробнее читайте в [официальной документации Telegram](https://core.telegram.org/bots/tutorial).

3. Скопируйте токен бота.

4. С помощью токена получите идентификатор чата для пользователя. Вы можете использовать следующий способ:

1. Пользователь пишет любое сообщение созданному боту.

2. Администратор системы получает идентификатор чата пользователя с ботом. Для этого:

- введите следующий запрос в браузере: \[OBJECT\], где \[OBJECT\] — токен, полученный при создании бота;

- в ответ на этот запрос на странице браузера появится JSON-текст, в котором содержится идентификатор чата.

Пример JSON-текста

````
\{  
  "ok": true,  
  "result": \[  
    \{  
      "update\_id": 000000000,  
      "message": \{  
        "message\_id": 17,  
        "from": \{  
          "id": 0000000001,  
          "is\_bot": false,  
          "first\_name": "UserName",  
          "language\_code": "ru"  
        \},  
        "chat": \{  
          "id": 0000000001,  
          "first\_name": "UserName",  
          "type": "private"  
        \},  
        "date": 1724073228,  
        "text": "Привет"  
      \}  
    \}  
  \]  
\}
````

5. ````
В профиле пользователя укажите его идентификатор чата в поле [Учетные записи](360004833572.md#accounts). Если идентификатор не указан, сотрудник войдёт в систему только по логину и паролю. 

## Шаг 2. Создать и настроить модуль

Перейдите в **Администрирование > Модули** и [создайте модуль](create-extention.md). Затем выполните настройки на открывшейся странице **Управление**:

1. На вкладке [Настройки](extention-settings.md) создайте свойства типа [Строка](360009707032.md#string), которые будут использованы в скриптах для получения кода подтверждения через бот мессенджера:

- **Тип аккаунта** (\[OBJECT\]) — название стороннего сервиса, через который настраивается двухфакторная аутентификация;

- **Токен бота** (\[OBJECT\]) — идентификатор бота на стороне внешнего сервиса. Выдаётся при создании бота;

- **Сообщение** (\[OBJECT\]) — сообщение, которое получит пользовать вместе с кодом подтверждения, например «Вы заходите в ELMA365. Ваш проверочный код: ».

Если все свойства указаны, перейдите на вкладку **Основные** и нажмите **Сохранить**.

2. Перейдите на вкладку **Методы API** и нажмите **Редактировать**. Откроется редактор методов. На вкладке **Скрипты** напишите код, используя следующий шаблон:

````
// Интерфейс позволят задать условия в указанной ниже функции, при которых у пользователя будет запрашиваться код второго фактора аутентификации  
interface SecondFactor\_sendError \{ error: string; skip2fa: boolean; \}  
  
// Функция определяет входящего пользователя по идентификатору и принимает код подтверждения  
async function secondFactor\_sendCode(userID: string, code: string): Promise<SecondFactor\_sendError> \{\} 

````
Пример скрипта для поиска входящего пользователя по идентификатору чата с Telegram-ботом

````
interface SecondFactor\_sendError \{  
    error: string;  
    skip2fa: boolean;  
\}  
  
async function secondFactor\_sendCode(userID: string, code: string): Promise<SecondFactor\_sendError> \{  
    let params = await Namespace.getParams()  
    let accountType = params.data.accountType  
    const result: SecondFactor\_sendError = \{ error: "", skip2fa: false \};  
  
    const user = await System.users.search().where(f => f.\_\_id.eq(userID)).first();  
    if (\!user) \{  
        result.error = 'no user';  
        return result  
    \}  
    if (\!user.data.accounts) \{  
        result.error = 'user has no accounts';  
        result.skip2fa = true;  
        return result;  
    \}  
  
    for (var account of user.data.accounts) \{  
        if (account.type === accountType) \{  
            sendToTelegram(account.login, code);  
            return result;  
        \}  
    \}  
  
    result.error = 'user has no such account type';  
    result.skip2fa = true;  
  
    return result;  
\}  
  
async function sendToTelegram(chatId: string, code: string): Promise<void> \{  
    let params = await Namespace.getParams()  
    let botToken = params.data.botToken;  
    let message = params.data.message;  
    const method = 'sendMessage';  
  
    fetch("https://api.telegram.org/bot" + botToken + "/" + method, \{  
        method: "POST",  
        headers: \{  
            'Content-Type': 'application/json'  
        \},  
        body: JSON.stringify(\{ 'chat\_id': chatId, 'text': message + code \})  
    \});  
\}
````

## ````
Шаг 3. Включить модуль для второго фактора аутентификации

1. Перейдите в **Администрирование > Модули**, откройте страницу модуля и включите его.

2. В открывшемся окне заполните поля:

- **Токен бота** — значение скопированного токена;

- **Тип аккаунта** — название стороннего сервиса;

- **Сообщение** — текст, который нужно отобразить перед кодом подтверждения.

**(2fa-integration-2.png)**

3. Сохраните настройки. Модуль готов к использованию.

4. Перейдите в **Администрирование > Настройки безопасности > Двухфакторная аутентификация** и выберите настроенный [модуль для второго фактора аутентификации](security_settings.md#2fa).

Теперь, если у пользователя в профиле указан его идентификатор чата с Telegram-ботом, сотруднику придёт код подтверждения при входе в систему.

**(2fa-integration-1.png)**