Подтверждение по входящему звонку#
Blitz Identity Provider позволяет передавать одноразовые коды для реализации второго фактора аутентификации в номере входящего звонка (метод Flash Call). В этом случае после успешной первичной аутентификации на номер пользователя будет выполнен звонок с заранее неизвестного телефонного номера, последние цифры которого потребуется ввести для подтверждения входа. Звонок выполняется с разрешения пользователя.
Для настройки метода Flash Call выполните описанную ниже последовательность действий.
Шаг 1. Добавление метода в blitz.conf#
Для того, чтобы в методах аутентификации на вкладке Второй фактор появился метод аутентификации Подтверждение по входящему звонку, выполните следующие действия:
Откройте файл
/usr/share/identityblitz/blitz-config/blitz.conf
.sudo vim /usr/share/identityblitz/blitz-config/blitz.conf
В блоке настроек
blitz.prod.local.idp.login.factors
во втором списке добавьте блок настроек с методомflashCall
:"login" : { "factors" : [ [ … ], [ { "enabled" : false, "method" : "flashCall" }, … ] ], … }
Перезапустите сервисы.
sudo systemctl restart blitz-idp blitz-console blitz-recovery
Шаг 2. Настройка метода в консоли#
В консоли управления выполните следующие действия:
На вкладке Подтверждение по телефонному звонку задайте следующие настройки:
Длина кода
: количество последних цифр номера входящего звонка, которые будут использоваться в качестве кода на втором факторе аутентификации.Время действия
: количество секунд, после которого код подтверждения перестает действовать и необходим повторный звонок.Количество попыток за один вход
: количество неудачных попыток ввода кода подтверждения при одной попытке входа. Если количество попыток превышено, требуется повторный звонок.Общее количество попыток
: общее число отправок кодов подтверждения и попыток ввода кода подтверждения, после которого данный способ аутентификации будет временно заблокирован.Время блокировки при превышении общего количества попыток, в минутах
: в течение указанного времени данный способ аутентификации будет недоступен пользователю.Название атрибута с мобильном номером пользователя
: выберите из списка атрибут, в котором хранится номер телефона пользователя для совершения звонка.
Нажмите Сохранить. В результате конфигурация метода будет обновлена и отобразится вкладка Драйвер провайдера звонков.
На вкладке Драйвер провайдера звонков задайте процедуру на Java для интеграции с REST-сервисом провайдера, предоставляющего услугу дозвона, по аналогии с примером ниже. Для написания процедуры используйте документацию провайдера и полученные при регистрации в сервисе провайдера настройки.
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())); } } }
Совет
См. подробнее об имплементации кастомных ошибок.
Включите метод Подтверждение по входящему звонку в списке методов на вкладке Аутентификация -> Второй фактор.