Подтверждение по входящему звонку#

Blitz Identity Provider позволяет передавать одноразовые коды для реализации второго фактора аутентификации в номере входящего звонка (метод Flash Call). В этом случае после успешной первичной аутентификации на номер пользователя будет выполнен звонок с заранее неизвестного телефонного номера, последние цифры которого потребуется ввести для подтверждения входа. Звонок выполняется с разрешения пользователя.

Для настройки метода Flash Call выполните описанную ниже последовательность действий.

Шаг 1. Добавление метода в blitz.conf#

Для того, чтобы в методах аутентификации на вкладке Второй фактор появился метод аутентификации Подтверждение по входящему звонку, выполните следующие действия:

  1. Откройте файл /usr/share/identityblitz/blitz-config/blitz.conf.

    sudo vim /usr/share/identityblitz/blitz-config/blitz.conf
    
  2. В блоке настроек blitz.prod.local.idp.login.factors во втором списке добавьте блок настроек с методом flashCall:

    "login" : {
        "factors" : [
            [
                …
            ],
            [
                {
                    "enabled" : false,
                    "method" : "flashCall"
                },
                …
            ]
        ],
        …
    }
    
  3. Перезапустите сервисы.

    sudo systemctl restart blitz-idp blitz-console blitz-recovery
    

Шаг 2. Настройка метода в консоли#

В консоли управления выполните следующие действия:

  1. На вкладке Подтверждение по телефонному звонку задайте следующие настройки:

    • Длина кода: количество последних цифр номера входящего звонка, которые будут использоваться в качестве кода на втором факторе аутентификации.

    • Время действия: количество секунд, после которого код подтверждения перестает действовать и необходим повторный звонок.

    • Количество попыток за один вход: количество неудачных попыток ввода кода подтверждения при одной попытке входа. Если количество попыток превышено, требуется повторный звонок.

    • Общее количество попыток: общее число отправок кодов подтверждения и попыток ввода кода подтверждения, после которого данный способ аутентификации будет временно заблокирован.

    • Время блокировки при превышении общего количества попыток, в минутах: в течение указанного времени данный способ аутентификации будет недоступен пользователю.

    • Название атрибута с мобильном номером пользователя: выберите из списка атрибут, в котором хранится номер телефона пользователя для совершения звонка.

    Нажмите Сохранить. В результате конфигурация метода будет обновлена и отобразится вкладка Драйвер провайдера звонков.

  2. На вкладке Драйвер провайдера звонков задайте процедуру на Java для интеграции с REST-сервисом провайдера, предоставляющего услугу дозвона, по аналогии с примером ниже. Для написания процедуры используйте документацию провайдера и полученные при регистрации в сервисе провайдера настройки.

    Пример процедуры для интеграции с провайдером Flash Call#
    package flashcall;
    
    import org.slf4j.LoggerFactory;
    import org.slf4j.Logger;
    import com.identityblitz.core.loop.http.HttpLoop;
    import com.identityblitz.core.loop.http.HttpLoopRequest;
    import com.identityblitz.core.loop.http.HttpLoopResult;
    import com.identityblitz.core.loop.*;
    import com.identityblitz.core.loop.http.*;
    import com.identityblitz.json.JObj;
    import java.util.Collections;
    
    public class FlashCallFlow implements HttpLoop {
                    private final org.slf4j.Logger logger = LoggerFactory.getLogger("com.identityblitz.idp.flow.dynamic");
    
                    @Override
            public HttpLoopRequest run(final JsObj obj, final HttpLoopResult result) {
                    if (result == null) {
                            final String number = obj.asString("phone_number");
                                    logger.trace("### flash call to = {}", number);
                                    return HttpLoop.callBuilder("POST", "http://test.flashcall.ru/api/v1")
                                            .withHeader("X-Token", "1234567890")
                                            .withBody(JsObj.empty.addString("id", "test_project").addString("dst_number", number.substring(number.length() - 10)))
                                            .withTimeout(20000)
                                            .build(JsObj.empty);
                    } else if (result.status() == 200) {
                            final JsObj body = result.body();
                            String callerInfo = body.asString("CallerID").substring(0, body.asString("CallerID").length() - 4) + "****";
                            return HttpLoop.Ok(JsObj.empty.addString("code", body.asString("CallerID")).addString("caller_info", callerInfo));
                    } else if (result.status() == 502) {
                            return HttpLoop.error("bad_gateway",
                                            Collections.<String, String>singletonMap("status", "" + result.status()));
                            } else {
                            return HttpLoop.error("wrong_http_status",
                                            Collections.<String, String>singletonMap("status", "" + result.status()));
                    }
            }
    
    }
    

    Совет

    См. подробнее об имплементации кастомных ошибок.

  3. Включите метод Подтверждение по входящему звонку в списке методов на вкладке Аутентификация -> Второй фактор.