All pages
Powered by GitBook
1 of 75

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Как работать с системой: базовые сценарии

В этом разделе описано, как выполнять проверки в рамках основных сценариев использования.

Liveness – проверка «живости», того, что человек, снятый на видео, действительно живой реальный человек в сознании.

Биометрия – сравнение двух или более лиц с различных фотографий или видеороликов с целью ценить степень их схожести (один и тот же это человек или разные люди).

Лучший кадр – выбор лучшего кадра из видеоролика для использования его в бизнес-процессах как результата Liveness-проверки, «видео в виде картинки».

Проверка по ЧС (черному списку) – проверка, присутствует ли человек, чье фото или видео загружается в систему, в базе заранее загруженных фотографий.

Руководство разработчика

Руководство по интеграции и настройке решений Oz Forensics

В этом разделе описаны API- и SDK-компоненты биометрической системы Oz Forensics. API – бэкенд, компонент, отвечающий за взаимодействие всех модулей системы. SDK – «внешняя часть», с помощью которой:

1) ведется съемка видеороликов или изображений, которые затем обрабатываются API,

2) демонстрируется результат обработки.

У нашего API существует две версии, использоваться можно любую в зависимости от ваших потребностей.

Полная версия соответствует полнофункциональному API.

Версия Lite – упрощенная, более легкая в использовании версия, в которой содержится только самое необходимое.

Мы также предоставляем SDK для вебсайтов и мобильных устройств.

Web SDK – модуль съемки и отправки медиаданных на анализы из веб-браузера. Он состоит из встраиваемого плагина и адаптера к этому плагину.

SDK для мобильных устройств включает в себя версии для iOs и Android.

Oz Mobile SDK (iOS, Android, Flutter)

Oz Mobile SDK – Software Developer’s Kit системы Oz Forensics, обеспечивающий удобную интеграцию с мобильными приложениями для регистрации и биометрической идентификации клиентов.

В настоящее время мобильные SDK работают в портретном режиме.

SDK

В этом разделе вы найдете описание SDK для десктопных и мобильных устройств.

Использование вебхуков для получения результатов

Вебхуки (webhook) упрощают процесс получения результатов анализов. После запуска анализов не нужно инициировать опрос с проверкой, завершены ли анализы. Вместо этого в запросе на анализы добавьте вебхук, который обратится к вашему веб-сайту, когда результаты будут готовы.

При создании папки добавьте нужный веб-адрес (resolution_endpoint) в раздел payload в теле запроса:

Каждый раз, когда анализы для этой папки будут готовы, вам будет приходить уведомление. Вебхук-запрос будет содержать результаты анализов и информацию о папке, для которой они выполнялись.

Коллекция Postman Oz API Lite

Для работы с Oz API Lite вы можете использовать свободно распространяемое ПО Postman. Скачайте клиентскую часть Postman по и установите ПО.

Загрузите JSON-файл с коллекцией Postman:

1.2.0

1.1.1

Импорт коллекции Postman

После запуска клиента необходимо импортировать актуальную коллекцию для Postman, для этого в клиенте нажмите кнопку Import:

Нажмите files для выбора файла, найдите нужный JSON и нажмите Открыть:

Импортированная коллекция со всеми методами взаимодействия появится в интерфейсе Postman:

API

В этом разделе вы найдете описание API.

Биометрия

Биометрический алгоритм позволяет сравнить несколько фотографий и оценить уровень схожести людей на них. В качестве источников проверки можно передавать фото, видео и документы (с фото).

Порядок действий:

  1. .

  2. .

3. .

Сохраните analyse_id из ответа.

4а. Через некоторое время .

Дождитесь, когда поля resolution_status и resolution изменят статус на любой, кроме PROCESSING, – этот статус и будет результатом.

4б. Еще один вариант: добавьте , который обратится к вашему сайту по завершении анализа. В payload запроса добавьте нужный адрес в поле resolution_endpoint:

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

Подробно статусы анализов описаны .

Поиск лучшего кадра

Алгоритм "лучший кадр" выбирает из видеозаписи наиболее качественный и удачный кадр с лицом. Алгоритм вызывается дополнительно к анализу .

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

Порядок действий:

  1. .

3. . Убедитесь, что параметр "extract_best_shot" имеет значение True, как показано ниже.

В source_media указывается media_id из ответа предыдущего запроса. Это опционально, если требуется проверить одно из двух заранее загруженных в папку видео.

Сохраните analyse_id из ответа.

4а. Через некоторое время п. Дождитесь, когда поля resolution_status и resolution изменят статус на любой, кроме PROCESSING, – этот статус и будет результатом.

4б. Еще один вариант: добавьте , который обратится к вашему сайту по завершении анализа. В payload запроса добавьте нужный адрес в поле resolution_endpoint:

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

Подробно статусы анализов описаны .

5. Лучший кадр можно получить из ответа results_media -> output_images -> original_url

Oz API

Описание

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

  • предоставляет единый Rest API для запуска Liveness и Biometry анализов

  • проводит и

  • ведет базу запросов и выполненных анализов

  • архивирует входящие медиаданные

  • собирает телеметрию с подключенных мобильных приложений

  • предоставляет возможность настроить специфичные модели устройств

  • генерирует подробные отчеты о результатах выполнения анализов

Описание основных методов Rest API схемы:

Коллекция Postman, включающая в себя все имеющиеся на данный момент методы:

Liveness
Биометрия
Поиск лучшего кадра
Проверка по черному списку
Oz API
Oz API Lite
Oz Liveness Web SDK
iOS
Android
Oz Mobile SDK (iOS, Android, Flutter)
Oz Liveness Web SDK
payload
{
  "media:tags": {
    "video1": [
      "video_selfie",
      "video_selfie_scan",
      "orientation_portrait"
    ],
    "photo1": [
      "photo_selfie"
    ],
    "doc1": [
      "photo_id",
      "photo_id_front"
    ]
  }
}
request body
{
  "analyses": [{
    "type": "biometry",
  // необязательный параметр
  // если не указать, анализ будет назначен на все медиафайлы в папке
  "source_media": [
    "1111aaaa-11aa-11aa-11aa-111111aaaaaa", 
    "2222bbbb-22bb-22bb-22bb-222222bbbbbb" 
      ]
  }]
}
{    
    "resolution_endpoint": "address.com",
    {
    .... // информация о папке и т.д.
    }
}
Авторизуйтесь
Поместите медиафайлы в папку
Запустите анализ
проверьте результат
вебхук
здесь
payload
{
  "media:tags": {
    "video1": [
      "video_selfie",
      "video_selfie_scan",
      "orientation_portrait"
    ]
  }
}
request body
{
  "analyses": [{
    "type": "quality",
    "source_media": ["6187a4ef-62c4-4445-bbb2-bf62d61f1fde"],
    "params" : {
      "extract_best_shot": true
    }
  }]
}
{    
    "resolution_endpoint": "address.com",
    {
    .... // информация о папке и т.д.
    }
}
liveness
Авторизуйтесь.
Поместите видеофайл в папку
Запустите анализ
роверьте результат
вебхук
здесь
Пример payload
{    
  "resolution_endpoint": "address.com", // укажите нужный адрес здесь
    ... // остальные детали запроса
}
Postman
ссылке
11KB
Oz API Lite 1.2.0.json
Open
8KB
Oz API Lite 1.1.1.postman_collection.json
Open
Android
iOS

Liveness

Определение живости

Алгоритм определения живости предназначен для проверки наличия живого человека по короткому видео фрагменту.

Порядок действий:

  1. Авторизуйтесь.

  2. Поместите медиафайл в папку.

payload
{
  "media:tags": {
    "video1": [
      "video_selfie",
      "video_selfie_scan",
      "orientation_portrait"
    ]
  }
}

3. Запустите анализ.

request body
{
  "analyses": [{
    "type": "quality",
    "source_media": ["6187a4ef-62c4-4445-bbb2-bf62d61f1fde"],
  }]
}

В source_media указывается media_id из ответа предыдущего запроса. Это опционально, если требуется проверить одно из двух заранее загруженных в папку видео.

Сохраните analyse_id из ответа.

4а. Через некоторое время проверьте результат.

Дождитесь, когда поля resolution_status и resolution изменят статус на любой, кроме PROCESSING, – этот статус и будет результатом.

4б. Еще один вариант: добавьте вебхук, который обратится к вашему сайту по завершении анализа. В payload запроса добавьте нужный адрес в поле resolution_endpoint:

{    
    "resolution_endpoint": "address.com",
    {
    .... // информация о папке и т.д.
    }
}

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

Подробно статусы анализов описаны здесь.

Результаты анализов

Здесь вы узнаете, как через API получить результаты выполненных анализов.

Результат любого анализа представляет собой число. Для анализа Biometry это число отражает степень совпадения/несовпадения лиц в загруженных вами медиафайлах по сравнению с референсами – теми файлами, которые хранятся в базе. Для анализа Liveness – возможность того, что на загруженном медиафайле не реальный живой человек в сознании, а какое-то его изображение или deepfake. Результаты анализов можно узнать и без захода в каждую заявку по отдельности – API предоставляет возможность извлечь их из JSON-ответа.

  1. Авторизуйтесь.

  2. Сделайте запрос к заявке или списку заявок. Параметр with_analyses должен быть установленTrue.

  3. Для типа анализа Biometry ищите значение параметра min_confidence:

"items": 
 [
  {
   "analyses": 
    [
     {
      "analyse_id": "biometry_analysis_id"
      "folder_id": "some_folder_id", 
      "type": "BIOMETRY", 
      "state": "FINISHED", 
      "results_data": 
       {
        "max_confidence": 0.997926354, 
        "min_confidence": 0.997926354
       }

Этот параметр отражает уверенность системы в том, что на представленных медиа фигурирует один и тот же человек.

4. Для типа анализа Liveness Analysis ищите значение параметра confidence_spoofing для нужного медиафайла:

"items": 
 [
  {
   "analyses": 
    [
     {
      "source_media": 
       [
        {
        "media_id": "your_media_id", 
        "media_type": "VIDEO_FOLDER",
        }
       ]
      "results_media": 
       [
        "analyse_id": "liveness_analysis_id",
        "results_data": 
         {
          "confidence_spoofing": 0.55790174
         }

Этот параметр показывает вероятность спуфинг-атаки – того, что на полученном видео, например, использовалась технология deepfake или вместо человека программе показали видеоролик с этим человеком.

Если нужно обработать несколько результатов анализов, запросите список заявок и сделайте парсинг JSON-ответа.

Проверка по черному списку

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

Порядок действий описан ниже.

1. Авторизуйтесь. Параметры передаются в json-запросе в составе credentials. См. статьи Коллекции Postman и Аутентификация.

2. Поместите видеофайл в папку, как описано здесь.

Пример заполнения payload для видео:

payload
{
  "media:tags": {
    "video1": [
      "video_selfie",
      "video_selfie_scan",
      "orientation_portrait"
    ]
  }
}

3. Запустите анализ: POST/api/folders/{{folder_id}}/analyses/

В типе анализа должно быть указано collection.

request body
{
    "analyses": [{
    "type": "collection",
    "source_media": ["идентификатор_медиафайла_источника"],
  }]
}

В source_media указывается media_id из ответа предыдущего запроса. Это опционально, если требуется проверить одно из двух заранее загруженных в папку видео.

Сохраните analyse_id из ответа.

4а. Через некоторое время проверьте результат. Дождитесь, когда поля resolution_status и resolution изменят статус на любой, кроме PROCESSING, – этот статус и будет результатом.

4б. Еще один вариант: добавьте вебхук, который обратится к вашему сайту по завершении анализа. В payload запроса добавьте нужный адрес в поле resolution_endpoint:

{    
    "resolution_endpoint": "address.com",
    {
    .... // информация о папке и т.д.
    }
}

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

Подробно статусы анализов описаны здесь.

Если вы хотите узнать, с кем именно из вашей базы фотографий совпало лицо с медиафайла, который вы только что загрузили, найдите в ответе анализ collection, в нем results_media, где и будет идентификатор нужной вам персоны person_id. Чтобы получить информацию об этой персоне, вызовите метод GET /api/collections/{{collection_id}}/persons/{{person_id}}, указав идентификаторы вашей коллекции и персоны в ней.

Oz API
Oz API Lite
авторизацию
распределение прав доступа
Коллекции Postman Oz API

Загрузка медиафайлов

Чтобы провести анализы для ваших медиафайлов, необходимо поместить их в папку – либо существующую, либо новую, созданную с помощью Oz API. Для каждого файла необходимо указать теги: они описывают, что это за файл и какие анализы к нему применимы.

Если у вас версия API 4.0.8 или старше, обратите внимание: если вы хотите загрузить фото с тем, чтобы позднее отправить его на анализ Liveness, поместите это фото в ZIP-архив и укажите для него теги, специфичные для видео.

Создание папки и добавление в нее медиафайлов: POST /api/folders/

Добавление файлов в существующую папку: POST /api/folders/{{folder_id}}/media/

Файлы должны быть добавлены в теле запроса, теги – в поле payload.

Пример заполнения payload для пассивного Liveness и фотографии лицевой стороны документа:

payload
{
    "media:tags": { // здесь устанавливаются теги для загружаемых вами медиафайлов
    // media files are referenced by the keys in a multipart form
        "video1": [ // ключ для файла
        // стандартный набор тегов для видео с пассивным Liveness
            "video_selfie", // видео с лицом
            "video_selfie_blank", //  отсутствует
            "orientation_portrait" // ориентация видео
        ],
        "photo1": [
        // стандартный набор тегов для лицевой стороны документа
            "photo_id",
            "photo_id_front"
        ]
    }
}

Пример использования (Postman):

В случае успеха в ответе вернется информация о папке.

Аутентификация и обработка данных

Instant API: режим работы без сохранения данных

В версии 6.0.1 мы добавили новый режим работы API – Instant. В этом режиме мы не сохраняем никакие данные, все, что вы отправляете и получаете, существует только в рамках вашего запроса и ответа на него. Таким образом вы экономите место в хранилище и, что может быть особенно важно в рамках соблюдения требований законодательства, не передаете и не храните чувствительные данные.

Чтобы включить режим Instant API, при подготовке файла конфигурации (config.py) для API установите параметру OZ_APP_COMPONENTS значение stateless. Чтобы никакие данные запроса и ответа не сохранялись, отправьте следующий запрос: POST /api/instant/folders/ . Авторизация настраивается на вашей стороне.

Обратите внимание: поскольку Instant API не хранит данные, работа в таком режиме с черным списком (1:N) не предусмотрена.

При использовании Instant API с Web SDK при установите параметру architecture значение lite. Версия Web SDK должна быть не ниже 1.7.14.

Минимальные системные требования

  • CPU: 16 ядер, 32 потока, базовая частота – 2.3 GHz, максимальная частота в турборежиме для одного ядра – 4 GHz.

  • RAM: 32 GB, DDR 5, Dual Channel.

Для расчета RPS и RPM и подбора оптимальной конфигурации под ваши задачи обратитесь к нам.

Параметры конфигурации

Перед запуском подготовьте файл конфигурации со следующими параметрами.

Обязательные параметры

Без этих параметров Instant API не запустится.

Установка

Docker

Docker Compose

Методы Instant API

Список методов доступен по . Также вы можете скачать коллекцию для Postman:

Oz API Lite

С выходом API 6.0 мы прекращаем развивать и поддерживать API Lite.

Oz API Lite – это версия Oz API, менее требовательная к ресурсам, более простая и производительная. Повышение производительности достигается благодаря отсутствию дополнительных функций (таких, как хранение данных или сбор статистики), а также тому, что анализы запускаются на уровне образа API Lite.

Отличия архитектуры Lite от типовой

  • Только один компонент, который нужно кластеризовать.

  • Нет хранилища данных – более высокий уровень защиты информации.

  • Более простая архитектура – более короткие сроки реализации проекта.

Примеры методов

Для проверки корректности работы процессора Liveness используйте GET /v1/face/liveness/health.

Для проверки корректности работы процессора Biometry используйте GET /v1/face/pattern/health.

Чтобы выполнить liveness-проверку лица на изображении, вызовите POST /v1/face/liveness/detect (на вход принимает изображение, на выходе выводит оценку присутствия презентационной атаки на этом изображении).

Для сравнения лиц на двух изображениях вызовите POST /v1/face/pattern/extract_and_compare (принимает два изображения, извлекает из них биометрические шаблоны и сравнивает эти шаблоны). Также возможно сравнение одного изображения с несколькими с помощью POST /v1/face/pattern/extract_and_compare_n.

Полный список методов Oz API Lite с детальной информацией по ним вы можете найти .

Аутентификация
Загрузка медиафайлов
Результаты анализов
Использование вебхуков для получения результатов
# список компонентов Oz API. Для Instant API укажите stateless
# для компонента авторизации добавьте auth
OZ_APP_COMPONENTS=stateless
# поддержка локального хранилища
OZ_LOCAL_STORAGE_SUPPORT_ENABLE=false
# адрес сервиса tfss
OZ_SERVICE_TFSS_HOST=http://xxx.xxx.xxx.xxx:xxxx
# разрешенные хосты
APP_ALLOWED_HOSTS=example-host1.com,example-host2.com
# секретный ключ
OZ_API_SECRET_KEY=long_secret_key
CONTAINER_NAME=<container name> \
DEPLOY_INSTANT_PORT_EXT=<external port> \
INSTANT_IMAGE=<provided image name> \
ADDITIONAL_PARAMS="-e LICENSE_KEY=<your license key>" \

docker run -d --name $CONTAINER_NAME
      $ADDITIONAL_PARAMS
      -p ${DEPLOY_INSTANT_PORT_EXT}:8080
      $INSTANT_IMAGE
services:
  oz-api-instant:
    image: <provided image>
    container_name: oz-api-instant
    environment:
        - LICENSE_KEY=<your license key>
        # - TF_ENABLE_ONEDNN_OPTS=1 # In some cases, especially for AMD CPUs, set to 0
        # - API_LISTEN_PORT=8080
        # - LOG_LEVEL=info # ['critical', 'error', 'warning', 'info', 'debug', 'trace']
    restart: always
    ports:
      - 8080:8080
конфигурации адаптера
ссылке
10KB
OZ-Forensic Instant 6.0.0.postman_collection.json
Open
облегченная
метод
метод
метод
метод
метода
здесь

Работа с черным списком (коллекцией) в Oz API

В этой статье рассказывается, как создать коллекцию методами API, как добавить в нее персону и фотографии, как потом все это удалить, а также удалить саму коллекцию. Все это можно также сделать через веб-консоль, однако здесь мы описываем только соответствующие методы API.

Коллекция в Oz API – это база фотографий лиц (персон), которые используются в анализе Blacklist для сравнения с лицом человека с только что снятого фото или видео.

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

Как создать коллекцию

Коллекция создается в рамках определенной компании, таким образом, для добавления новой коллекции необходим идентификатор компании company_id.

Если вы его не знаете, найдите компанию поиском с помощью метода GET /api/companies/?search_text=test, где test – наименование компании или его часть. Сохраните полученный company_id.

Для создания коллекции вызовите метод POST /api/collections/. В теле запроса укажите название своей коллекции (alias) и company_id нужной компании, как показано ниже:

{
  "alias": "blacklist",
  "company_id": "your_company_id"
}

В ответе на запрос будет идентификатор коллекции collection_id. Он понадобится на следующем шаге.

Как добавить персону или фото в коллекцию

Для добавления новой персоны в коллекцию вызовите метод POST /api/collections/{{collection_id}}/persons/, где collection_id – идентификатор коллекции из предыдущего шага. В запросе передайте фото персоны (или несколько фото). В Payload укажите соответствующие фото теги, как показано ниже.

{
    "media:tags": {
        "image1": [
            "photo_selfie",
            "orientation_portrait"
        ]
    }
}

В ответе вам придет идентификатор персоны person_id - это идентификатор отдельного человека в коллекции.

В этом же запросе через payload можно добавить данные о персоне:

    "person:meta_data": {
        "person_info": {
            "first_name": "John",
            "middle_name": "Jameson",
            "last_name": "Doe"
        }
    },

Вы также можете загрузить дополнительные фото персоны после ее добавления: используйте метод POST {{host}}/api/collections/{{collection_id}}/persons/{{person_id}}/images/ с соответствующим person_id. Тело запроса заполните так же, как для метода POST /api/collections/{{collection_id}}/persons/.

Чтобы получить информацию о всех персонах в коллекции, вызовите метод GET /api/collections/{{collection_id}}/persons/.

Если вам нужен список фотографий для отдельной персоны, воспользуйтесь методом GET /api/collections/{{collection_id}}/persons/{{person_id}}/images/. Обратите внимание: для каждого фото будет указан идентификатор фото person_image_id – он потребуется вам, например, для удаления фото.

Как удалить фото или персону из коллекции

Чтобы удалить персону со всеми соответствующими ей фотографиями, используйте метод DELETE /api/collections/{{collection_id}}/persons/{{person_id}}, указав идентификаторы коллекции и персоны. Все фото этой персоны удалятся автоматически. Персону нельзя удалить, если с ней связаны анализы – то есть если эта персона участвовала в анализе Black list и с ней были найдены совпадения. Для удаления такой персоны сперва нужно удалить соответствующие анализы методом DELETE /api/analyses/{{analyse_id}} (потребуется analyse_id анализа collection (Black list)).

Для удаления всех связанных с коллекцией анализов запросите список всех папок с анализом Black list: call GET /api/folders/?analyse.type=COLLECTION. Для каждой папки из списка (GET /api/folders/{{folder_id}}/), найдите analyse_id нужного анализа, а затем удалите анализ – DELETE /api/analyses/{{analyse_id}}.

Для удаления определенной фотографии той или иной персоны вызовите метод DELETE /api/collections/{{collection_id}}/persons/{{person_id}}/images/{{person_image_id}} и укажите идентификаторы коллекции, персоны, фотографии.

Как удалить коллекцию целиком

Перед удалением коллекции нужно удалить информацию о всех входящих в нее персонах, а затем стереть саму коллекцию с помощью метода DELETE /api/collections/{{collection_id}}/.

Метаданные

Обзор

При создании какого-либо объекта системы у вас может возникнуть необходимость хранить для него дополнительные данные, те, которые отсутствуют в базовом списке его параметров. Такие данные называются метаданными. Вы можете хранить любую нужную вам информацию в разделе meta_data в приведенном ниже формате ("название поля": "соответствующие полю данные"):

…
meta_data:
{
  "field1": "value1",
  "field2": "value2"
}
…

Объекты и методы

Метаданные можно добавить к большинству объектов системы. Список объектов с соответствующими им методами для добавления метаданных приведен ниже. Также метаданные можно указать при создании объекта.

Объект

Метод API

Пользователь

PATCH /api/users/{{user_id}}

Папка (заявка)

PATCH /api/folders/{{folder_id}}/meta_data/

Медиафайл

PATCH /api/media/{{media_id}}/meta_data

Анализ

PATCH /api/analyses/{{analyse_id}}/meta_data

Коллекция

PATCH /api/collections/{{collection_id}}/meta_data/

and, for a person in a collection,

PATCH /api/collections/{{collection_id}}/persons/{{person_id}}/meta_data

Метаданные можно также и менять, и удалять. Все нужные методы описаны в нашей документации по API.

Примеры использования

Метаданные могут вам потребоваться, например, если вы захотите группировать папки (заявки) по людям или лидам. Например, для подсчета конверсии в случаях, когда один лид делает несколько попыток пройти анализ Liveness, добавьте идентификатор этого лида в метаданные соответствующих папок.

Чтобы добавить идентификатор клиента iin к объекту папки, в тело запроса внесите соответствующую запись:

{
  "iin": "123123123"
}

Вы можете передать в это поле идентификатор клиента и затем использовать его для получения запросов по одному и тому же клиенту или подсчета уникальных клиентов (одинаковый идентификатор = один и тот же клиент, разные идентификаторы = разные клиенты). Идентификатор может быть номером телефона, документа или любым другим уникальным идентификатором. Идентификатор будет отображаться в отчете отдельной колонкой.

Еще один частый случай использования метаданных связан с безопасностью: вы обрабатываете результат анализа на своем бэкенде, но не хотите при этом использовать идентификатор папки при обращении к ней. Добавьте отдельный идентификатор (transaction_id) в метаданные папки, и вы сможете искать нужную информацию по нему. Подробно этот случай использования описан здесь.

Если вы храните в метаданных персональные данные, убедитесь, что при этом не нарушаются соответствующие законы.

Метаданные можно также добавить через SDK, а затем работать с ними с помощью методов API. Добавление метаданных через SDK описано в соответствующих разделах:

  • iOS

  • Android

  • Web

Журнал изменений

1.2.3 – 21.11.2024

  • Исправили ошибку, иногда возникавшую при генерации параметров time_created и folder_id метода Detect.

  • Обновления безопасности.

1.2.2 – 17.10.2024

  • Обновили модели.

1.2.1 – 05.09.2024

  • С помощью метода Liveness detect теперь можно отправить не более 10 файлов в одном запросе, при этом размер каждого файла не должен превышать 15 МБайт.

  • Обновили список жестов, которые поддерживают отправку лучшего кадра (best_shot): включили повороты, наклон и подъем головы, а также улыбку и моргание.

1.2.0 – 26.07.2024

  • Обновили метод Liveness detect: теперь он работает также и с видео и архивами.

1.1.1 – 28.11.2022

  • Добавили метод для проверки версий компонентов

1.1.0

  • API Lite теперь работает и с base64

09.2021

  • Улучшили биометрическую модель

  • Добавили режим 1:N

08.2021

  • Добавили политику CORS

  • Подготовили первую версию документации

06.2021

  • Переработали сообщения об ошибках, теперь они более информативны

  • Упростили операции Liveness/Detect

04.2021

  • Переработали ядро

  • Добавили операции для защиты от спуфинга

10.2020

  • Добавили операцию extract_and_compare

Аутентификация

Как получить и обновить токены доступа.

Аутентификация пользователя

Чтобы получить токены доступа, нужно выполнить POST-запрос на /authorize/auth/. В теле запроса нужно указать полученные от нас электронную почту и пароль в составе credentials, а также API-адрес в качестве адреса хоста.

Body

{
	"credentials": {
		"email": "{{user_email}}",
		"password": "{{user_password}}"
	}
}

Результатом аутентификации пользователя является пара access_token и expire_token.

access_token – ключ (набор символов), предъявление которого является пропуском к ресурсам системы. Обращение к ним происходит с указанием в заголовках полученного access_token.

headers = {‘ X-Forensic-Access-Token’: <access_token>}

Действие access_token ограничено во времени и регулируется настройками:

  • для сервисных учетных записей – OZ_SESSION_LONGLIVE_TTL (по умолчанию 5 лет),

  • для всех остальных – OZ_SESSION_TTL (по умолчанию 15 минут).

expire_token предназначен для обновления пары access_token и expire_token.

Автопродление сессий

если expire_date > текущей даты, то expire_date сессии устанавливается в значение текущей даты + временная дельта настроек, описанных выше.

Обновление токенов

Чтобы обновить пару access_token и expire_token, нужно выполнить POST-запрос на адрес authorize/refresh/ c expire_token в теле запроса и X-Forensic-Access-Token в заголовках.

{
    "expire_token": "{{expire_token}}"
}

Положительным результатом будет ответ с новой парой access_token и expire_token. Предыдущая пара access_token и expire_token будет удалена из базы данных при первой аутентификации по новой паре access_token и expire_token.

Возможные ошибки

Код ошибки

Сообщение об ошибке

Причина

400

Could not locate field for key_path expire_token from provided dict data

expire_token отсутствует в теле запроса.

401

Session not found

Не существует сессии с переданным expire_token.

403

You have not access to refresh this session

Пользователь, который делает запрос, не является владельцем сессии переданного expire_token.

Android

Работа с OZ Mobile SDK в операционной системе «Android»

Чтобы начать пользоваться нашим SDK, нужно выполнить следующие шаги.

  1. Добавьте SDK в проект, как описано здесь.

  2. Получите лицензию на SDK – сгенерируйте тестовую самостоятельно на нашем сайте или запросите «боевую» по электронной почте. Для лицензии потребуется application id. Добавьте лицензию в проект, как описано здесь.

  3. Подключите SDK к API. Это необязательный шаг, он выполняется, только если вам нужно обрабатывать какие-либо данные на сервере.

  4. Для съемки видео используйте методы, описанные здесь – вы получите медиафайлы, которые потом можно будет отправить на анализ.

  5. Запустите нужные вам проверки для полученных на предыдущем шаге медиафайлов. Здесь описано, как выполнять проверки.

  6. Если вы хотите настроить внешний вид SDK, здесь написано, как это делается.

Ресурсы

Рекомендуемая версия Android: 5+ (чем новее смартфон, тем быстрее выполняются анализы).

Рекомендуемые версии компонентов:

Версия Gradle

7.5.1

Версия Kotlin

1.7.21

Версия AGP

7.3.1

Java Target Level

1.8

Версия JDK

17

Мы не поддерживаем эмуляторы.

Доступные языки: EN, RU, ES, HY, KK, KY, TR.

Исходные коды примеров приложений с использованием Oz Liveness SDK расположены в репозитории GitLab:

Список методов и полей SDK:

Актуальную сборку демо-приложения Вы можете загрузить по ссылке.

Теги медиафайлов

Каждый загружаемый медиафайл требуется маркировать специальными тегами. Это необходимо для корректной работы алгоритмов распознавания. Теги для видео и фото отличаются друг от друга.

Теги видеофайлов

Для видеофайлов в Системе должны быть указаны следующие типы тегов:

  • Тег, определяющий тип данных «видео»:

    • video_selfie

  • Тег, определяющий ориентацию видео:

    • orientation_portrait – портретная ориентация;

    • orientation_landscape – ландшафтная ориентация.

  • Тег, определяющий действие на видео:

    • video_selfie_left – поворот головы налево;

    • video_selfie_right – поворот головы направо;

    • video_selfie_down – наклон головы вниз;

    • video_selfie_high – наклон головы вверх;

    • video_selfie_smile – улыбка;

    • video_selfie_eyes – моргание;

    • video_selfie_scan – сканирование;

    • video_selfie_oneshot – анализ по одному кадру;

    • video_selfie_blank – нет действия.

Алгоритмы распознают файлы с тегами из этого списка как подходящие для выполнения анализов (Liveness) и .

Важно: в версии API 4.0.8 или старше, чтобы отправить на анализ Quality (Liveness) изображение, а не видео, необходимо поместить его в архив .zip, установить тип файла SHOTS_SET и поставить один из тегов video_, иначе Quality изображение проигнорирует.

Пример корректного набора тегов видеофайла с действием «моргание»:

Теги фотофайлов

Для фотофайлов в Системе должны быть указаны следующие типы тегов:

  • Тег для селфи:

    • photo_selfie – тег, определяющий тип фотографии «селфи»

  • Теги для фотографий или сканов удостоверений личности:

    • photo_id – тег, определяющий тип фотографии «документы»;

    • photo_id_front – фото лицевой стороны документа;

    • photo_id_back – фото обратной стороны документа (любые другие анализы, кроме Документов, файлы с этим тегом игнорируют).

Важно: в версии API 4.0.8 или старше, чтобы отправить на анализ Quality (Liveness) изображение, а не видео, необходимо поместить его в архив .zip, установить тип файла SHOTS_SET и поставить один из тегов video_, иначе Quality изображение проигнорирует.

Пример корректного набора тегов фотофайла «селфи»:

Пример корректного набора тегов фотофайла с лицевой стороной документа:

Пример корректного набора тегов фотофайла с обратной стороной документа:

Типы анализов и что они проверяют

Виды и назначение биометрических анализов медиаданных в Oz Api, как интерпретировать результат.

В Oz Api существует несколько видов анализов:

  • ,

  • ,

  • ,

  • .

Возможные качественные результаты анализов описаны здесь: .

У каждого из анализов есть пороговое значение, определяющее статус анализа на выходе. По умолчанию этот порог равен 0.5 или 50%, для Blacklist и Biometry (Face Matching) – 0.85 или 85%.

  • Biometry: значение не ниже порога означает, что лица совпадают.

  • Blacklist: значение не ниже порога означает, что лицо с проанализированного медиафайла совпало с одним из лиц в черном списке.

  • Quality: значение не ниже порога означает наличие атаки.

Чтобы настроить пороговое значение под ваши нужды, .

Больше информации по интерпретации численных результатов анализов вы можете найти здесь: .

Biometry

Назначение

Биометрический алгоритм позволяет сравнить несколько фото и оценить уровень схожести запечатленных на них людей. В качестве источников проверки можно передавать фото, видео и страницы документов с фото. Для корректной работы нужно как минимум 2 файла-источника (подробности смотрите на странице ).

Результат

Анализ выдает уровень схожести изображений лиц в процентах от 100 до 0% (1->0), где:

  • 100% (1) – максимальная схожесть,

  • 0% (0) – схожесть отсутствует.

Quality (Liveness, Best Shot)

Назначение

Алгоритм определения живости Liveness (анализ Quality) предназначен для проверки наличия живого человека в коротком видеоролике или на фото.

Алгоритм "лучший кадр" (best shot) выбирает из видеозаписи наиболее качественный и удачный кадр с лицом. Алгоритм вызывается дополнительно к анализу .

Результат

Анализ выдает возможность спуфинга*/атаки в процентах, где:

  • 100% (1) – атака, перед камерой не живой человек,

  • 0% (0) – перед камерой реальный человек в сознании.

*Спуфинг в биометрической области – (англ. spoofing – подмена) это ситуация, в которой человек маскируется под другого человека, используя программные и не программные средства (виртуальная камера, демонстрация изображения лица с экрана смартфона или фотографии, маски или силиконовой головы).

Documents

Назначение

Анализ распознавания и проверки документов предназначен для базового определения наличия документа в кадре и проверки корректности полей документа согласно его типу. Параллельно проводится биометрический анализ (сверка фотографии из документа и селфи, сделанного человеком).

В Oz Api интегрирован сервис OCR-анализа документов от партнера. Также возможно использование другого сервиса OCR по желанию клиента. Свяжитесь с .

Результат

Анализ документов выдает два варианта результатов:

  • Документы успешно проверены,

  • Документы не прошли проверку.

Также выводится набор полей документа с результатами распознавания по каждому полю и результат биометрического анализа.

Blacklist

Назначение

Алгоритм проверки по черному списку предназначен для проверки присутствия человека в базе заранее загруженных фото.

База заранее загруженных фото может называться как "Черным списком", если туда внесены фотографии лиц мошенников или других нежелательных для бизнеса людей, так и "Белым списком", если она содержит фотографии лиц VIP-персон.

Результат

Анализ по черному списку выдает процент схожести от 100 до 0% (1->0), где:

  • 100% (1) – это максимальная схожесть, алгоритм нашел совпадения с изображениями из черного списка.

  • 0% (0) – минимальная схожесть, алгоритм не нашел совпадений с изображениями из черного списка.

Отправка на анализ единым запросом

В версии 6.0.1 мы добавили возможность отправить все необходимые для анализа данные и получить результат с помощью единственного запроса. До этого взаимодействие с API требовало последовательной отправки нескольких запросов: на , затем на назначение анализов (, , ), после этого – на получение результата (поллинг или ). Если вам нужны отдельные запросы, вы можете работать таким образом и дальше, но теперь есть и упрощенный способ: все это можно сделать одним запросом, включающим в себя все вышеуказанное.

Преимущества

  • Вся информация отправляется в одном запросе, снижая вероятность потери по пути части данных.

  • Синхронная работа – как только анализ завершится, вы получите результат, не нужно опрашивать сервер о готовности или настраивать вебхуки.

  • Высокая производительность – до 36 анализов в минуту на один сервер.

Использование

Чтобы отправить медиафайлы на анализ одним запросом, вызовите метод POST /api/folders/. В заголовке X-Forensic-Access-Token передайте ваш . Добавьте в тело запроса нужные медиафайлы, а в payload – соответствующие им теги и, если нужно, метаданные.

Пример запроса

Пример ответа

В ответе вам придут результаты анализов.

Готово.

Получение лицензии

Сгенерируйте тестовую лицензию самостоятельно (внимание, страница на английском языке) или свяжитесь с нами по для выпуска продуктивной лицензии. Для подготовки лицензии потребуется applicationId (bundle id).

Для добавления файла лицензии в SDK вызовите метод OzLivenessSDK.init с одним из параметров LicenseSources:

  • LicenseSource.LicenseAssetId должен содержать путь к файлу forensics.license, расположенному в проекте в папке res/raw.

  • LicenseSource.LicenseFilePath должен содержать пусть к файлу на устройстве (вне проекта).

Если при обработке лицензии возникнут ошибки, вы получите сообщение с описанием этих ошибок. Если ошибок нет, система выведет данные о лицензии. Вы также можете запросить эти данные с помощью метода getLicensePayload.

Возможные ошибки лицензии

Сообщение об ошибке
Что делать
  "video1": [
      "video_selfie",
      "video_selfie_eyes",
      "orientation_portrait"
    ]
  "photo1": [
      "photo_selfie"
  ]
"photo1": [
    "photo_id", "photo_id_front"
]
"photo1": [
    "photo_id", "photo_id_back"
]
Quality
Biometry
biometry
quality (liveness, best shot)
documents
blacklist
Статусы API
обратитесь к нам
Результаты анализов
Правила назначения анализов
liveness
отделом продаж
{
  // (необязательно) метаданные папки, если нужны
  "folder:meta_data": {
    "partner_side_folder_id": "00000000-0000-0000-0000-000000000000",
    "person_info": {
      "first_name": "John",
      "middle_name": "Jameson",
      "last_name": "Doe"
    }
  },
  // (необязательно) метаданные папки, если нужны
  "media:meta_data": {
    "video1": {
      "foo": "bar"
    }
  },
  "media:tags": {
    "video1": [
      "video_selfie",
      "video_selfie_eyes",
      "orientation_portrait"
    ]
  },
  "analyses": [
    {
      "type": "quality",
      // (необязательно) метаданные папки, если нужны
      "meta_data": {
        "example1": "some_example1"
      },
      // дополнительные параметры
      "params": {
        "threshold_spoofing": 0.5,
        "extract_best_shot": false
      }
    }
  ]
}
{
  "company_id": "00000000-0000-0000-0000-000000000000",
  "time_created": 1744017549.366616,
  "folder_id": "00000000-0000-0000-0000-000000000000",
  "user_id": "00000000-0000-0000-0000-000000000000",
  "resolution_endpoint": null,
  "resolution_status": "FINISHED",
  "resolution_comment": "[]",
  "system_resolution": "SUCCESS",
  ...
  // метаданные папки, если есть
  "meta_data": {
    "partner_side_folder_id": "00000000-0000-0000-0000-000000000000",
    "person_info": {
      "first_name": "John",
      "middle_name": "Jameson",
      "last_name": "Doe"
    }
  },
  "media": [
    {
      "company_id": "00000000-0000-0000-0000-000000000000",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "folder_time_created": 1744017549.366616,
      "original_name": "00000000-0000-0000-0000-000000000000.mp4",
      "original_url": null,
      "media_id": "00000000-0000-0000-0000-000000000000",
      "media_type": "VIDEO_FOLDER",
      "tags": "video1": [
		"video_selfie",
		"video_selfie_eyes",
		"orientation_portrait"
	]
      "info": {},
      "time_created": 1744017549.368665,
      "time_updated": 1744017549.36867,
	  // метаданные медиафайлов, если есть
      "meta_data": {
        "foo": "bar"
      },
      "thumb_url": null,
      "image_id": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "time_updated": 1744017549.366629,
  "analyses": [
    {
      "company_id": "00000000-0000-0000-0000-000000000000",
      "group_id": "00000000-0000-0000-0000-000000000000",
      "folder_id": "00000000-0000-0000-0000-000000000000",
      "folder_time_created": 1744017549.366616,
      "analysis_id": "00000000-0000-0000-0000-000000000000",
      "state": "FINISHED",
      "resolution_operator": null,
      "results_media": [
        {
         ...
        }
      ],
      "results_data": null,
	  // метаданные анализа, если есть
      "meta_data": {
        "example1": "some_example1"
      },
      "time_created": 1744017549.369485,
      "time_updated": 1744017550.659305,
      "error_code": null,
      "error_message": null,
      "source_media": [
        {
	 ...
        }
      ],
      "type": "QUALITY",
      "analyse_id": "00000000-0000-0000-0000-000000000000",
      "resolution_status": "SUCCESS",
      "resolution": "SUCCESS"
    }
  ]
}
создание папки и загрузку медиафайлов
Liveness
биометрия
черный список
вебхук
токен доступа

License error. License at (your_URI) not found

Отсутствует файл лицензии. Проверьте наименование и путь к файлу.

License error. Cannot parse license from (your_URI), invalid format

Файл лицензии поврежден. Пожалуйста, отправьте его нам по электронной почте.

License error. Bundle company.application.id is not in the list allowed by license (bundle.id1, bundle.id2)

Идентификатор приложения отсутствует в списке разрешенных для данной лицензии идентификаторов. Проверьте написание, если все корректно, нужна новая лицензия.

License error. Current date yyyy-mm-dd hh:mm:ss is later than license expiration date yyyy-mm-dd hh:mm:ss

Срок действия лицензии истек. Пожалуйста, свяжитесь с нами.

License is not initialized. Call 'OzLivenessSDK.init before using SDK

Лицензия не устанавливалась. Вызовите метод OzLivenessSDK.init, как показано выше в этой статье

здесь
email
OzLivenessSDK.init(context,
    listOf(
        LicenseSource.LicenseAssetId(R.raw.your_license_name),
        LicenseSource.LicenseFilePath("абсолютный путь к файлу лицензии")
    ),
    object : StatusListener<LicensePayload> {
        override fun onSuccess(result: LicensePayload) { /*проверка информации о лицензии*/ }
        override fun onError(error: OzException) { /*обработка исключения */ }
    }
  )
OzLivenessSDK.INSTANCE.getConfig().setBaseURL(BASE_URL);
OzLivenessSDK.INSTANCE.init(context,
    Arrays.asList(
        new LicenseSource.LicenseAssetId(R.raw.forensics),
        new LicenseSource.LicenseFilePath("aбсолютный путь к файлу лицензии")
    ),
    new StatusListener<LicensePayload>() {
        @Override public void onStatusChanged(@Nullable String s) {}
        @Override public void onSuccess(LicensePayload licensePayload) { /*проверка информации о лицензии*/ }
        @Override public void onError(@NonNull OzException e) { /*обработка исключения */ }
    }
);

Локализация для Android: добавление или обновление языкового пакета

Обратите внимание: описанная ниже функциональность работает, начиная с версии 8.1.0.

Чтобы добавить или обновить языковой пакет для Oz Android SDK, сделайте следующие шаги:

Перевод состоит из ключа локализации и соответствующей ему строчки, например, <string name="about">"About"</string>.

  1. Перейдите в папку для нужной локали или создайте такую папку. Детально процесс описан здесь.

  2. Создайте файл и назовите его strings.xml.

  3. Скопируйте строки из приложенного файла в только что созданный.

  4. Переопределите в переводах строки, которые вам нужны.

Список переводов для Android:

15KB
Oz_SDK_Android_Strings.zip
archive
Open

Ключи вида action_*_go относятся к соответствующим жестам. Остальные – к подсказкам для всех жестов, информационным сообщениям или ошибкам.

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

Описание коллбэка on_error

Этот коллбэк вызывается, если в системе возникает какая-либо ошибка. Он возвращает информацию об ошибке и идентификатор телеметрии, с помощью которого можно получить дополнительные данные о причине сбоя.

on_error { 
    "code": "error_code", 
    "event_session_id": "id_of_telemetry_session_with_error", 
    "message": "<error decription>", 
    "context": {}  // дополнительная информация
}

Прежний дизайн

Если вы при обновлении с прежних версий (до 6.4.2 включительно) хотите сохранить привычный для клиентов дизайн, сбросьте настройки интерфейса экрана съемки до значений по умолчанию и примените следующие параметры (приведены только те параметры, которые нужно изменить):

// параметры настройки верхней панели
let toolbarCustomization = ToolbarCustomization(
   closeButtonColor: .white,
   backgroundColor: .black)

// параметры настройки текста подсказки
let centerHintCustomization = CenterHintCustomization(
   verticalPosition: 70)
   
// параметры настройки анимации подсказки
let hintAnimationCustomization = HintAnimationCustomization(
    hideAnimation: true)

// параметры настройки рамки вокруг лица
let faceFrameCustomization = FaceFrameCustomization(
   strokeWidth: 6,
   strokeFaceAlignedColor: .green,
   strokeFaceNotAlignedColor: .red)

// параметры настройки фона за рамкой
let backgroundCustomization = BackgroundCustomization(
   backgroundColor: .clear)

OZSDK.customization = OZCustomization(toolbarCustomization: toolbarCustomization,
   centerHintCustomization: centerHintCustomization,
   hintAnimationCustomization: hintAnimationCustomization,
   faceFrameCustomization: faceFrameCustomization,
   versionCustomization: versionCustomization,
   backgroundCustomization: backgroundCustomization)

Flutter

Этот раздел описывает, как работать с Oz Flutter SDK для iOS и Android.

Перед началом работы мы рекомендуем установить:

  • Flutter версии 3.0.0 или выше;

  • Android SDK версии 21 или выше;

  • dart версии 2.18.6 или выше;

  • iOS версии 13 или выше;

  • Xcode.

Образец кода для Flutter вы можете найти здесь.

Методы и поля Android SDK

Локализация для iOS: добавление или обновление языкового пакета

Обратите внимание: описанная ниже функциональность работает, начиная с версии 8.1.0.

Чтобы добавить или обновить языковой пакет для Oz iOS SDK, используйте метод set(languageBundle: Bundle). Он информирует SDK, что вы планируете использовать отличный от стандартного бандл. В OzLocalizationCode используйте кастомный язык (опционально).

Перевод состоит из ключа локализации и соответствующей ему строчки, например, "about" = "О программе".

  • Если вы не укажете кастомные язык и бандл, SDK будет использовать имеющиеся переводы.

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

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

Список переводов для iOS:

12KB
Oz_SDK_iOS_Strings.zip
archive
Open

Ключи вида Action.*.Task относятся к соответствующим жестам. Остальные – к подсказкам для всех жестов, информационным сообщениям или ошибкам.

При появлении новых ключей, если переводов для них в кастомном бандле нет, будет показываться текст на языке по умолчанию (английском).

Статусы API

В данном разделе описаны все возможные статусы анализов в API.

Имя поля / статус
analyse.state
analyse.resolution_status
folder.resolution_status
system_resolution

Ниже приведены разъяснения по каждому статусу.

Состояние анализа (analyse.state)

Состояние выполнения анализа принимает следующие значения:

PROCESSING – в обработке;

FAILED – анализ выполнить не удалось, произошла ошибка;

FINISHED – выполнение анализа завершено.

Результат анализа (analyse.resolution_status)

Если выполнение анализа завершено, результат выполнения может принимать следующие значения:

SUCCESS– проверка пройдена успешно;

OPERATOR_REQUIRED (кроме анализа Liveness) – требуется (т.е. дополнительная проверка человеком);

Наличие/отсутствие статуса OPERATOR_REQUIRED зависит от настроек биометрии.

DECLINED – проверка не пройдена (лицо не совпало или совпало с лицом из ЧС в зависимости от настроек, атака, лицо не совпало с лицом в документах).

Если анализ не завершен, результат наследует значение из analyse.state: PROCESSING (еще в обработке) / FAILED (возникли ошибки, завершить анализ не удалось).

Состояние заявки (folder.resolution_status)

Заявка – это папка, в которой лежат медиафайлы для анализа. Если анализы еще не завершены, в resolution_status вы увидите одно из следующих значений:

INITIAL – анализы не назначены;

PROCESSING – анализы выполняются;

FAILED – выполнить анализы не удалось (произошли ошибки);

FINISHED – папка обработана, выполнение анализов завершено.

Результат заявки (system_resolution)

Результат заявки – консолидированный результат всех анализов, назначенных для медиафайлов из этой папки. Обратите внимание: результат заявки представляет собой результат группы анализов, завершившейся последней. Если все назначенные анализы выполнены, результат будет:

SUCCESS– все хорошо, проверки пройдены успешно;

OPERATOR_REQUIRED (кроме анализа Liveness) – анализы со статусом DECLINED отсутствуют, но один или больше анализов завершились со статусом OPERATOR_REQUIRED;

DECLINED – один или больше анализов завершились с результатом DECLINED, то есть проверка не прошла.

Анализы, которые вы отправляете в одном POST-запросе, объединяются в группу. Результат группы анализов определяется по "худшему" из результатов анализов в этой группе: INITIAL > PROCESSING > FAILED > DECLINED > OPERATOR_REQUIRED > SUCCESS, где SUCCESS означает, что все проверки прошли успешно без каких-либо ошибок.

Ошибки вызова сервиса

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

Коды HTTP-ответов

  • Коды ответов в диапазоне 2XX соответствуют корректно отработавшему запросу (например, при получении данных возвращается код 200, при добавлении новой сущности – 201, при корректном удалении – 204 и так далее);

  • Коды ответов в диапазоне 4XX соответствуют ошибке при обработке запроса, произошедшей на стороне вызывающего клиента (например, 404 – обращение к несуществующему ресурсу);

  • Коды ответов в диапазоне 5XX соответствуют ошибке при обработке запроса на стороне самой системы (например, при временной недоступности базы данных).

Тело ответа при ошибке

Каждая ошибка, возникшая при обработке запроса на стороне системы, помимо соответствующего HTTP-кода ошибки содержит также описание самой ошибки в теле ответа с указанием следующих JSON-полей:

  • error_code – целочисленный код ошибки;

  • error_message– сообщение с описанием возникшей ошибки (используется только для отладочных задач и расследования инцидентов);

  • details – детали ошибки (приводятся в произвольном формате, специфичном для каждого отдельного типа ошибки). Необязательное поле.

Пример ответа сервера:

Коды ошибок:

Добавление плагина на web-страницу

Для подключения плагина на страницу необходимо добавить в html-код страницы ссылку на основной скрипт плагина (plugin_liveness.php). web-sdk-root-url – это полученная от нас ссылка на Web Adapter.

Для версий до 1.4.0

Добавьте в html-код страницы ссылку на основной скрипт плагина (plugin_liveness.php) и файл со стилями (ozliveness.css). web-sdk-root-url – это полученная от нас ссылка на Web Adapter.

При использовании Angular и Vue подключение стилей и скриптов происходит так же. При интеграции с React-приложениями необходимо загружать и инициализировать плагин в head на главной странице шаблона. Внимание: при использовании <React.StrictMode> возможна некорректная работа Web Liveness.

Прежний дизайн

Если вы при обновлении с прежних версий (до 6.4.2 включительно) хотите сохранить привычный для клиентов дизайн, сбросьте настройки интерфейса экрана съемки до значений по умолчанию и примените следующие параметры (приведены только те параметры, которые нужно изменить):

Добавление SDK в проект

В build.gradle проекта добавьте строки:

В build.gradle модуля добавьте строки (VERSION – версия, которую вы планируете добавить. Список версий можно найти в ):

для анализов на сервере

для анализов и на сервере, и на устройстве

Обратите внимание: размер выходного файла будет больше.

Вне зависимости от выбранного режима, добавьте еще:

Описание коллбэка on_complete

Этот коллбэк вызывается после окончания проверки и возвращает результат анализа (не применяется в режиме capture). Вид результата зависит от result_mode.

Пожалуйста, обратите внимание: в целях безопасности мы рекомендуем настроить логику принятия решений на стороне вашего бэкенда. Более детальную информацию и примеры кода вы можете найти .

Safe

Если result_mode установлен как safe, коллбэкon_complete возвращает только состояние анализов:

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

Status

При значении status коллбэк возвращает состояние анализов, а также – для каждого типа анализа – название типа, состояние анализа этого типа и вердикт системы.

Folder

При значенииfolderвозвращается практически то же самое, что при status, только добавляется идентификатор папки.

Full

В этом случае коллбэк возвращает полную информацию, включая чувствительные данные. Мы рекомендуем использовать safe; full будет отключен в ближайших релизах из соображений безопасности.

Выполнение проверок

Если наш SDK используется только для съемки, пропустите этот шаг.

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

Как интерпретировать результаты анализов, описано здесь: .

Пример:

Для удаления медиафайлов после выполнения всех проверок используйте метод clearTempDirectory.

Добавление метаданных

Для добавления метаданных используйте метод AnalysisRequest.addFolderMeta.

Извлечение лучшего кадра

В структуре Analysis можно передать дополнительные параметры, например, для извлечения на сервере лучшего кадра.

Использование медиафайла, снятого не нашим SDK

Чтобы использовать медиафайлы, снятые не Oz iOS SDK, укажите путь к ним в структуре (полеbestShotURL):

Добавление медиафайлов в определенную папку

Для добавления медиафайлов в определенную папку используйте метод addFolderId:

Локализация: добавление собственного языкового пакета

Для добавления нового языкового пакета или модификации существующего следует воспользоваться методом add_lang(lang_id, lang_obj).

Параметры:

  • lang_id – строковое значение, которое далее можно использовать в качестве параметра lang метода open();

  • lang_obj– объект, ключами которого являются идентификаторы строк перевода, а значениями – сами строки перевода.

Список идентификаторов языков:

lang_id
Язык

*До версии 1.3.1 назывался pt.

Пример использования:

OzLiveness.add_lang('ru', ruTranslation), гдеruTranslation – объект JSON.

Для установки нужного языка укажите его идентификатор в lang:

Вы можете запросить, какие языковые пакеты установлены в Web SDK, с помощью метода ozLiveness.get_langs(). Добавленные вручную локали также отобразятся.

Список всех строковых идентификаторов:

Ключи вида oz_action_*_go относятся к соответствующим жестам. oz_tutorial_camera_* – к подсказкам, как включить камеру для различных браузеров. Остальные – к подсказкам для всех жестов, информационным сообщениям или ошибкам.

Если какие-либо из ключей в вашем языковом пакете отсутствуют, соответствующие строки будут отображаться на английском языке.

Для версий до 1.5.0

Если какие-либо из ключей в вашем языковом пакете отсутствуют, соответствующие строки отображаться не будут.

Добавление SDK в приложение

CocoaPods

Для добавления OZLivenessSDK в ваше приложение через менеджер зависимостей CocoaPods и интеграции OZLivenessSDK в проект Xcode добавьте в Podfile:

VERSION (опционально, по умолчанию устанавливается последняя версия) – версия, которую можно найти в .

Начиная с версии 8.1.0, можно использовать упрощенный код:

По умолчанию устанавливается полная версия SDK (с режимами анализа на сервере и на устройстве). Если нужен только серверный анализ, код будет выглядеть так:

Для версий 8.1.0 и выше:

SPM

Установка через SPM возможна для SDK версий 8.7.0 и новее.

Добавьте через SPM зависимости пакетов по ссылке: (, как добавить зависимости). Файл OzLivenessSDK обязателен для добавления, OzLivenessSDKOnDevice можно не добавлять, если вы не используете анализы на устройстве.

Ручная установка

Вы также можете добавить файлы SDK в проект вручную.

  1. Скачайте следующие файлы и добавьте их в проект:

  • OZLivenessSDK.xcframework,

  • OZLivenessSDKResources.bundle,

  • OZLivenessSDKOnDeviceResources.bundle (если вы не используете анализы на устройстве, этот файл можно не скачивать).

  1. Скачайте TensorFlow : потребуется версия 2.11.

  2. Убедитесь, что:

  • оба файла xcframework отображаются в Target-Build Phases -> Link Binary With Libraries и Target-General -> Frameworks, Libraries, and Embedded Context;

  • файл(ы) bundle отображаются в Target-Build Phases -> Copy Bundle Resources.

Совместимость с браузерами

Для работы плагина Oz Liveness браузер должен поддерживать JavaScript ES6. Версия браузера должна быть не ниже указанной в таблице.

Браузер
Версия

*В режиме совместимости с Internet Explorer Web SDK работать не будет, так как не поддерживаются некоторые важные функции.

Подключение к API

Для авторизации в Oz API используйте адрес API и , как показано ниже.

Мы рекомендуем указывать адрес API в вашем приложении на экране, предшествующем проверке Liveness. После установки адреса происходит служебный вызов API, и если вы устанавливаете адрес при запуске или инициализации приложения, нагрузка на сервер может быть слишком высокой.

Второй вариант: логин и пароль.

Мы рекомендуем использовать метод аутентификации по токену доступа, как более безопасный.

По умолчанию логи сохраняются вместе с данными по анализам. Если вы планируете хранить логи отдельно от этих данных, настройте отдельное подключение для :

Web Plugin

При работе с Web SDK ваше приложение обращается к Web Plugin, который работает в контексте браузера. Плагин обменивается информацией с Web Adapter, а тот, в свою очередь – с Oz API.

Образец кода Oz Liveness Web SDK находится . Чтобы все работало корректно, нужно заменить <web-adapter-url> на полученную от нас ссылку на Web Adapter.

В перечисленных ниже образцах кода нужно заменить ссылку https://web-sdk.sandbox.ozforensics.com в index.html.

  • Образец кода для

  • Образец кода для

  • Образец кода для

  • Образец кода для

Скрытие и закрытие плагина

Скрытие окна плагина без отмены callback'ов

Чтобы скрыть окно плагина, не отменяя запросы результатов анализов и пользовательские callback'и, воспользуйтесь методом hide(). Метод может пригодиться, если, к примеру, после отправки данных требуется вывести собственный индикатор загрузки.

Закрытие плагина

Для принудительного закрытия окна плагина воспользуйтесь методом close(). При этом все запросы к серверу и callback-функции (кроме on_close) в рамках данной сессии будут остановлены.

Пример использования:

Google Chrome (и другие браузеры на движке Chromium)

56

Mozilla Firefox

55

Safari

11

Microsoft Edge*

17

Opera

47

OzLiveness.open({
  // При получении промежуточного результата скрываем окно плагина и показываем собственные индикаторы загрузки
  on_result: function(result) {
    OzLiveness.hide();
    if (result.state === 'processing') {
      show_my_loader();
    }
  },
  on_complete: function() {
    hide_my_loader();
  }
});
var session_id = 123;

OzLiveness.open({
  // Передаем произвольные метаданные, по которым в дальнейшем сможем идентифицировать сессию в Oz API
  meta: {
    session_id: session_id 
  },
  // После отправки данных принудительно закрываем окно плагина и самостоятельно запрашиваем результат 
  on_submit: function() {
    OzLiveness.close();
    my_result_function(session_id);
  }
});

INITIAL

-

-

начальное состояние

начальное состояние

PROCESSING

начальное состояние

начальное состояние

анализы в процессе

анализы в процессе

FAILED

ошибка системы

ошибка системы

ошибка системы

ошибка системы

FINISHED

успешное завершение

-

успешное завершение

DECLINED

-

отрицательный анализ

-

отрицательный анализ

OPERATOR_REQUIRED

-

требуется перепроверка

-

требуется перепроверка

SUCCESS

-

положительный анализ

-

положительный анализ

оператор
{
    "error_code": 0,
    "error_message": "Unknown server side error occurred",
    "details": null
}

Код ошибки

Значение

Описание

0

UNKNOWN

Неизвестная серверная ошибка.

1

NOT ALLOWED

Вызван недопустимый метод, обычно сопровождается 405 статусом HTTP-ответа при вызове HTTP-метода, не поддерживаемого ресурсом (например PATCH, если ресурс поддерживает только GET/POST).

2

NOT REALIZED

Вызван web-сервис, который не реализован на сервере, может встретиться в случае, если сервис по документации присутствует, однако фактически не реализован (временно или на постоянной основе).

3

INVALID STRUCTURE

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

4

INVALID VALUE

Некорректное значение параметра, например может возникать в случаях: передана строка, которая должна иметь формат UUID, но при этом она не конвертируется корректно, передано отрицательное значение смещения/ширины окна при постраничном запросе.

5

INVALID TYPE

Некорректный тип данных для параметра.

6

AUTH NOT PROVIDED

Не указан токен авторизации.

7

AUTH INVALID

Указан несуществующий авторизационный токен.

8

AUTH EXPIRED

Авторизационный токен просрочен.

9

AUTH FORBIDDEN

Недостаточно прав для запрошенной операции.

10

NOT EXIST

Запрашиваемый ресурс не существует (аналог HTTP status_code = 404).

11

EXTERNAL SERVICE

Ошибка взаимодействия с внешней информационной системой.

12

DATABASE

Критическая ошибка работы с базой данных на стороне сервера.

Коллекции Postman
Примерах использования
<script src="/plugin_liveness.php"></script>
<link rel="stylesheet" href="https:///plugin/ozliveness.css" />
<script src="https:///plugin_liveness.php"></script>
allprojects {
  repositories {
    maven { url "https://ozforensics.jfrog.io/artifactory/main" }
  }
}
dependencies {
  implementation 'com.ozforensics.liveness:sdk:VERSION'
}
dependencies {
implementation 'com.ozforensics.liveness:full:VERSION'
}
android {
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}
Журнале изменений
{
  "state": "finished"
}
{
 "state": "finished",
 "analyses": {
   "quality": {
     "state": "finished",
     "resolution": "success"
   }
 }
}
{
 "state": "finished",
 "folder_id": "your_folder_id",
 "analyses": {
   "quality": {
     "state": "finished",
     "resolution": "success"
   }
 }
}
параметра настройки Web Adapter
здесь
Рекомендациями по безопасности
let analysisRequest = AnalysisRequestBuilder()

// создайте анализы
let analysis = Analysis.init(
    media: mediaToAnalyze, // mediaToAnalyze – массив объектов OzMedia 
    type: .quality, // типы анализов перечислены в методах iOS SDK
    mode: .serverBased // .onDevice для анализа на устройстве
)
analysisRequest.addAnalysis(analysis)

// initiate the analyses
analysisRequest.run(
    statusHandler: { state in }, // добавьте обработчик шагов сценария
    errorHandler: { _ in } 
) { result in
          // ваш обработчик результата
  }
let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased)
var folderMeta: [String: Any] = ["key1": "value1"]
analysisRequest.addFolderMeta(folderMeta)
...
let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased, params: [“extract_best_shot” : true])
let referenceMedia = OZMedia.init(movement: .selfie,
                  mediaType: .movement,
                  metaData: ["meta":"data"],
                  videoURL: nil,
                  bestShotURL: imageUrl,
                  preferredMediaURL: nil,
                  timestamp: Date())
let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased)
analysisRequest.addFolderId(IdRequired)
Типы анализов
OzMedia

en

Английский

ru

Русский

es

Испанский

pt-br*

Португальский (бразильский)

kz

Казахский

// Редактируем текст кнопки
OzLiveness.add_lang('ru', {
  action_photo_button: 'Сделать фото'
});
OzLiveness.open({
    lang: 'es', // идентификатор нужного языка
    ...
});
30KB
Web SDK Strings 1.6.0. RU.zip
archive
Open
pod 'OZLivenessSDK', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios', :tag => 'VERSION'
// для установки последней версии
pod ‘OZLivenessSDK’
// ИЛИ для установки конкретной версии
// pod ‘OZLivenessSDK’, ‘8.10.0’
pod 'OZLivenessSDK/Core', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios.git',  :tag => 'VERSION'
pod ‘OZLivenessSDK/Core’
// ИЛИ
// pod ‘OZLivenessSDK/Core’, ‘8.1.0’
Журнале изменений
https://gitlab.com/oz-forensics/oz-mobile-ios-sdk
здесь описано
отсюда
здесь
OZSDK.setApiConnection(Connection.fromServiceToken(host: "https://sandbox.ohio.ozforensics.com", token: token)) { (token, error) in
}
OZSDK.setApiConnection(Connection.fromCredentials(host: “https://sandbox.ohio.ozforensics.com”, login: login, password: p)) { (token, error) in
    // Ваш код для обработки ошибки или токена
}
let eventsConnection = Connection.fromCredentials(host: https://echo.cdn.ozforensics.com/,
                                login: <[email protected]>,
                                password: your_telemetry_password)
OZSDK.setEventsConnection(eventsConnection) { (token, error) in
}
токен доступа
телеметрии
OzLivenessSDK.INSTANCE.getConfig().setCustomization(new UICustomization(
// параметры настройки верхней панели
new ToolbarCustomization(
    R.drawable.ib_close,
    new Color.ColorHex("#FFFFFF"),
    new Color.ColorHex("#000000"),
    100, // непрозрачность фона верхней панели (в %)
    ),
// параметры настройки текста подсказки
new CenterHintCustomization(
    70, // положение по вертикали (в %)
),
// параметры настройки анимации подсказки
new HintAnimation(
    hideAnimation = true
),
// параметры настройки рамки вокруг лица
new FaceFrameCustomization(     
    new Color.ColorHex("#EC574B"), 
    new Color.ColorHex("#00FF00"),
    6, // ширина линии рамки (в dp)
 ),
// параметры настройки фона за рамкой
new BackgroundCustomization(
    100 // непрозрачность фона (в %)
),
  )
);
OzLivenessSDK.config.customization = UICustomization(
    // параметры настройки верхней панели
    toolbarCustomization = ToolbarCustomization(
        closeIconTint = Color.ColorHex("#FFFFFF"),
        backgroundColor = Color.ColorHex("#000000"),
        backgroundAlpha = 100,
    ),
    // параметры настройки текста подсказки
    centerHintCustomization = CenterHintCustomization(
        verticalPosition = 70
    ),
    hintAnimation = HintAnimation(
    hideAnimation = true
),
    // параметры настройки рамки вокруг лица
    faceFrameCustomization = FaceFrameCustomization(
        strokeDefaultColor = Color.ColorHex("#EC574B"),
        strokeFaceInFrameColor = Color.ColorHex("#00FF00"),
        strokeWidth = 6,
    ),
    // параметры настройки фона за рамкой
    backgroundCustomization = BackgroundCustomization(
        backgroundAlpha = 100
    ),
)

Получение лицензии

Для работы SDK требуется лицензия. Сгенерируйте тестовую лицензию самостоятельно здесь (внимание, страница на английском языке) или свяжитесь с нами по email для выпуска продуктивной лицензии. Для подготовки лицензии потребуется bundle id. Есть два способа добавить лицензию в проект:

  1. Переименуйте файл в forensics.license и поместите его в проект. Прописывать путь в этом случае не нужно.

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

OZSDK(licenseSources: [.licenseFileName(“forensics.license”)]) { licenseData, error in
      if let error = error {
        print(error)
      }
    }

или

OZSDK(licenseSources: [.licenseFilePath(“path_to_file”)]) { licenseData, error in
      if let error = error {
        print(error)
      }
    }

LicenseSource – источник лицензии, LicenseData – информация о лицензии. В этот метод встроена проверка наличия активной лицензии, если такая лицензия есть – будет использоваться она, а не та, путь к которой вы указали. Для принудительной замены лицензии используйте метод setLicense.

Если при обработке лицензии возникнут ошибки, вы получите сообщение с описанием этих ошибок. Если ошибок нет, система выведет данные о лицензии. Вы также можете запросить эти данные с помощью OZSDK.licenseData.

Возможные ошибки лицензии

Сообщение об ошибке
Что делать

License error. License at (your_URI) not found

Отсутствует файл лицензии. Проверьте наименование и путь к файлу.

License error. Cannot parse license from (your_URI), invalid format

Файл лицензии поврежден. Пожалуйста, отправьте его нам по электронной почте.

License error. Bundle company.application.id is not in the list allowed by license (bundle.id1, bundle.id2)

Идентификатор приложения отсутствует в списке разрешенных для данной лицензии идентификаторов. Проверьте написание, если все корректно, нужна новая лицензия.

License error. Current date yyyy-mm-dd hh:mm:ss is later than license expiration date yyyy-mm-dd hh:mm:ss

Срок действия лицензии истек. Пожалуйста, свяжитесь с нами.

License is not initialized.

Лицензия не устанавливалась. Добавьте лицензию в проект.

Лицензирование без использования сервера

Для выпуска лицензии потребуется информация о доменных именах сайтов, где будет использоваться Web SDK. Можно также указывать поддомены.

Чтобы узнать доменный адрес, в режиме разработчика выполните window.origin на странице, где будет запускаться Web SDK. При использовании Web SDK на localhost / 127.0.0.1 лицензия может работать без информации о доменных именах.

Укажите информацию о лицензии одним из двух способов:

  • через данные о лицензии:

OzLiveness.open({
    license: {
        'payload_b64': 'some_payload',
        'signature': 'some_data',
        'enc_public_key': 'some_key'
    },
    ...,
})
  • через путь к лицензии:

OzLiveness.open({
    licenseUrl: 'https://some_url',
    ...,
})

Проверьте, как установилась лицензия: например, пройдите по доменному имени хоста и выполните действие Liveness -> Simple selfie.

Далее при каждом запуске Web SDK система будет проверять валидность лицензии.

Съемка видео

Создайте контроллер для съемки видео:

let actions: [OZVerificationMovement] = [.scanning, .smile, .far]
let ozLivenessVC: UIViewController = OZSDK.createVerificationVCWithDelegate(self, actions: actions)
self.present(ozLivenessVC, animated: true)

action– перечень действий пользователя при записи видео.

По окончании съемки вызывается метод onOZLivenessResult(results:[OZMedia]):

extension viewController: OZLivenessDelegate {
 func onError(status: OZVerificationStatus?) {
        //показать ошибку
   }
 }
 func onOZLivenessResult(mediaToAnalyze: [OZMedia]) {
   //Перейти к выполнению проверки
 }
}

Метод возвращает результаты съемки в виде массива объектов[OZMedia], которые используются на следующем шаге для выполнения проверок.

Если наш SDK используется только для съемки, пропустите шаг "Выполнение проверок".

Если пользователь прервет запись видео (закроет экран), появится ошибка failedBecauseUserCancelled.

здесь
Angular
React
Vue
Svelte
Добавление плагина на web-страницу
Запуск плагина
Скрытие и закрытие плагина
Локализация: добавление собственного языкового пакета
Настройка интерфейса
Рекомендации по безопасности
Совместимость с браузерами
Лицензирование без использования сервера

Коллекции Postman Oz API

Для работы с Oz API вы можете использовать свободно распространяемое ПО Postman. Скачайте клиентскую часть Postman по ссылке и установите ПО.

Загрузите JSON-файл с нужной коллекцией Postman.

6.0

256KB
OZ-Forensic 6.0.0.postman_collection.json
Open

Отдельная коллекция для Instant API:

10KB
OZ-Forensic Instant 6.0.0.postman_collection.json
Open

5.3 и 5.2

301KB
OZ-Forensic 5.2.0-.postman_collection.json
Open

5.0

Oz API 5.1.0 работает с этой же коллекцией.

299KB
OZ-Forensic 5.0.0.postman_collection.json
Open

4.0

298KB
OZ-Forensic 4.0.0.postman_collection_v4.json
Open

3.33

168KB
OZ-Forensic 3.33.0.postman_collection.json
Open

Импорт коллекции Postman

После запуска клиента необходимо импортировать актуальную коллекцию для Postman, для этого в клиенте нажмите кнопку Import:

Нажмите files для выбора файла, найдите нужный JSON и нажмите Открыть:

Импортированная коллекция со всеми методами взаимодействия появится в интерфейсе Postman:

Выполнение проверок

Если наш SDK используется только для съемки, пропустите этот шаг.

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

Как интерпретировать результаты анализов, описано здесь: .

Пример работы:

Для удаления медиафайлов после выполнения всех проверок используйте метод clearActionVideos.

Добавление метаданных

Для добавления метаданных используйте метод addFolderMeta.

Извлечение лучшего кадра

В структуре Analysis можно передать дополнительные параметры, например, для извлечения на сервере лучшего кадра.

Использование медиафайла, снятого не нашим SDK

Чтобы использовать медиафайлы, снятые не Oz Android SDK, укажите путь к ним в структуре :

Добавление медиафайлов в определенную папку

Для добавления медиафайлов в определенную папку используйте метод setFolderId:

Описание коллбэка on_result

Этот коллбэк вызывается раз в несколько секунд в процессе анализа и возвращает промежуточный результат (не применяется в режиме capture). Вид результата зависит от result_mode.

Пожалуйста, обратите внимание: в целях безопасности мы рекомендуем настроить логику принятия решений на стороне вашего бэкенда. Более детальную информацию и примеры кода вы можете найти .

Safe

Если result_mode установлен как safe, коллбэк on_result возвращает только состояние анализов:

или

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

Status

При значении status коллбэк возвращает состояние анализов, а также – для каждого типа анализа – название типа, состояние анализа этого типа и вердикт системы.

или

Folder

При значенииfolderвозвращается практически то же самое, что при status, только добавляется идентификатор папки.

Full

В этом случае коллбэк возвращает полную информацию, включая чувствительные данные. Мы рекомендуем использовать safe; full будет отключен в ближайших релизах из соображений безопасности.

Журнал изменений

8.18.1 – 10.09.2025

  • initSDK в дебаг-режиме для iOS теперь работает корректно.

8.18.0 – 26.08.2025

  • Добавили возможность выполнять .

  • Исправили ошибку в коде примера.

  • Подсказка для жеста Сканирование теперь озвучивается корректно.

  • При попытке удалить референтное фото SDK теперь запрашивает подтверждение.

  • Исправили ошибку с темным фоном при запуске SDK.

  • Исправили ошибку, из-за которой при биометрическом анализе одно из изображений переворачивалось.

  • Исправили несколько ошибок, возникавших во время анализов на устройстве и при гибридном анализе.

  • Android: теперь поддерживаем Google Dynamic Feature Delivery.

  • Android: исправили ошибку, из-за которой SDK мог вылететь при закрытии экрана съемки.

  • iOS: исправили ошибку с интеграцией через Swift UI.

  • iOS: в соответствии с требованиями Apple обновили Xcode до версии 16.

  • Повысили безопасность и обновили телеметрию.

8.16.0 – 30.04.2025

  • Обновили логику авторизации.

  • Улучшили логику озвучивания подсказок.

  • Обновления безопасности.

  • Android: валидацию видео – опцию, которая запускает запись видео заново, если получившийся файл состоит из 3 кадров и менее – теперь можно отключить.

  • iOS: SDK теперь сжимает медиафайлы, если их размер превышает 10 МБ.

  • iOS: жесты с движениями головы теперь обрабатываются корректно.

  • iOS: в соответствии с требованиями Apple обновили Xcode до версии 16.

8.14.0 – 17.12.2024

  • Обновления безопасности и телеметрии.

  • Подсказки SDK и элементы управления интерфейса могут озвучиваться в соответствии с требованиями WCAG.

  • Упростили прохождение проверки для жестов, включающих движение головы.

  • Android: сжатие больших видео теперь происходит на этапе закрытия экрана Liveness.

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

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

  • Android: исправили ошибку, из-за которой некоторые записанные SDK видео были зелеными.

  • iOS: добавили поддержку Xcode 16.

  • iOS: при использовании основной (задней) камеры яркость экрана теперь не меняется.

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

8.12.0 – 11.10.2024

  • Метод executeLiveness больше не используется. Съемка теперь запускается с помощью метода startLiveness.

  • Обновили код для получения результата съемки.

  • Обновления безопасности и телеметрии.

8.8.2 – 27.06.2024

  • При попытке передать пустую строку в качестве аргумента для методов addFolderId (iOS) и setFolderID (Android)теперь показывается информативная ошибка.

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

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

  • Обновления безопасности и телеметрии.

8.6.0 – 15.04.2024

  • Android: улучшили модель Liveness для проверки на устройстве.

  • Android: обновления безопасности.

  • iOS: синхронизировали с Android сообщения, которые SDK показывает после загрузки медиафайла.

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

8.5.0 – 20.03.2024

  • Длительность жеста Селфи теперь можно менять (размер видеофайла также изменится).

  • Убрали паузу после жеста Сканирование.

  • Обновления безопасности и журналирования.

  • Android: если размер записанного видеофайла больше 10 Мбайт, видео будет сжато.

8.4.0 – 11.01.2024

  • Android: обновили модель Liveness для проверки на устройстве.

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

  • Исправили ошибки.

8.3.0 – 30.11.2023

  • Добавили возможность использования мастер-лицензии, которая работает с любым bundle_id.

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

  • iOS: исправили ошибку с мигающим фоном при съемке.

8.2.0 – 17.11.2023

  • Выпущена первая версия.

Подключение к API

Для авторизации в Oz API используйте адрес API и , как показано ниже.

Мы рекомендуем:

  • Указывать адрес API в вашем приложении на экране, предшествующем проверке Liveness. После установки адреса происходит служебный вызов API, и если вы устанавливаете адрес при запуске или инициализации приложения, нагрузка на сервер может быть слишком высокой.

  • Убедиться, что перед вызовом метода createStartIntent вы инициализировали SDK и подключили его к API. Порядок действий значения не имеет, но они должны успешно завершиться к моменту начала работы createStartIntent.

Второй вариант: логин и пароль.

Мы рекомендуем использовать метод аутентификации по токену доступа, как более безопасный.

По умолчанию логи сохраняются вместе с данными по анализам. Если вы планируете хранить логи отдельно от этих данных, настройте отдельное подключение для :

Очистка авторизации:

Проверка наличия сохраненного access-токена Oz API:

LogOut:

Настройка интерфейса до версии 1.0.1

Для настройки интерфейса воспользуйтесь разделом style в методе Ozliveness.open. Изменить можно следующие настройки:

  • faceFrame – цвет рамки вокруг лица:

    • faceReady – цвет рамки при правильном расположении лица;

    • faceNotReady – цвет рамки при неправильном положении лица, когда анализ не может быть запущен.

  • centerHint – текст подсказки в центре.

    • textSize – размер текста;

    • color – цвет текста;

    • yPosition – позиция по вертикали относительно верха контейнера;

    • letterSpacing – расстояние между буквами;

    • fontStyle – стиль текста (полужирный, курсив и так далее).

  • closeButton – кнопка закрытия плагина:

    • image – изображение для кнопки, может быть картинкой в формате PNG или dataURL в base64.

  • backgroundOutsideFrame – заливка вне рамки вокруг лица:

    • color – цвет заливки.

Пример:

Рекомендации по безопасности

Получение и обработка результатов анализа на бэкенде

Результаты анализа доступны клиентскому приложению через функции-коллбэки Web Plugin, однако мы рекомендуем получать их через бэкенд напрямую от Oz API и там же обрабатывать впоследствии. Таким образом исключается вероятность манипуляций с результатами анализов через контекст браузера.

Чтобы найти нужную папку со стороны бэкенда, сделайте следующее:

  1. На фронтенде добавьте уникальный идентификатор папки через метаданные:

    Вы можете добавить собственные пары ключ-значение для хранения любой текстовой информации, например, номера документа или телефона. Однако удостоверьтесь при этом, что соблюдаются нормы законодательства о защите персональной информации.

  2. Для оповещения о завершении анализа используйте функцию-коллбэк on_result, затем вызовите бэкенд и передайте значение transaction_id.

  3. На стороне бэкенда найдите папку по присвоенному ранее идентификатору с помощью метода Folder LIST:

    Для ускорения обработки запроса мы рекомендуем ограничить выдачу по времени:

  4. В ответе придут результаты анализов и идентификатор папки folder_id - он потребуется для дальнейших действий.

Ограничение объема данных, которые сервер отправляет Web Plugin

Web Adapter отправляет Web Plugin данные с различным уровнем детализации. Для продакшна рекомендуется установить минимальный уровень. Для этого в Web Adapter установите параметру result_mode значение "safe".

OzLiveness.open({
  // ...
  style: {
	  //блок для обратной совместимости
    doc_color: "", 
    face_color_success: "",
    face_color_fail: "", 
	//основной блок
    faceFrame: {
      faceReady: "",
      faceNotReady: "",
    },
    centerHint: {
      textSize: "",
      color: "",
      yPosition: "",
      letterSpacing: "", 
      fontStyle: "", 
    },
    closeButton: {
      image: "",
    },
    backgroundOutsideFrame: {
      color: "", 
    },
  },
  // ...
});
{
 "state": "processing"
}
{
 "state": "finished"
}
{
 "state": "processing",
 "analyses": {
   "quality": {
     "state": "processing",
     "resolution": ""
   }
 }
}
{
 "state": "finished",
 "analyses": {
   "quality": {
     "state": "finished",
     "resolution": "success"
   }
 }
}
{
 "state": "processing",
 "folder_id": "your_folder_id",
 "analyses": {
   "quality": {
     "state": "processing",
     "resolution": ""
   }
 }
}
параметра настройки Web Adapter
здесь
Рекомендациями по безопасности
анализ для конкретной папки с использованием ее идентификатора
OzLiveness.open({
  ...
  meta: { 
  // идентификатор пользователя или лида из стороннего лидогенератора
  // передавайте ID, если вам нужно отслеживать несколько попыток от одного и того же пользователя
    'end_user_id': '<user_or_lead_id>',
  // уникальный идентификатор попытки
    'transaction_id': '<unique_id1>'
  }
});
/api/folders/?meta_data=transaction_id==unique_id1&with_analyses=true
/api/folders/?meta_data=transaction_id==unique_id1&with_analyses=true&time_created.min=([CURRENT_TIME]-1hour)
"result_mode": "safe"
файле конфигурации
    .addFolderMeta(
        mapOf(
            "key1" to "value1",
            "key2" to "value2"
        )
    )
.addFolderMeta(Collections.singletonMap("key", "value")) 
mapOf("extract_best_shot" to true)
       val file = File(context.filesDir, "media.mp4") // замените context.filesDir на context.getExternalFilesDir(null) для внешнего хранилища смартфона
       val media = OzAbsractMedia.OzVideo(OzMediaTag.VideoSelfieSmile, file.absolutePath)
    .setFolderId(folderId)
Типы анализов
OzAbstractMedia
analysisCancelable = AnalysisRequest.Builder()
// mediaToAnalyze – массив объектов OzAbstractMedia
    .addAnalysis(Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaToAnalyze))// ON_DEVICE для анализа на устройстве
    .build()
//запуск анализов и установка обработчиков
    .run(object : AnalysisRequest.AnalysisListener {
        override fun onStatusChange(status: AnalysisRequest.AnalysisStatus) { handleStatus(status) //или ваш обработчик шагов сценария 
        }
        override fun onSuccess(result: RequestResult) {
            handleResults(result) //или ваш обработчик результата
        }
        override fun onError(error: OzException) { handleError(error) //или ваш обработчик ошибок 
        }
    })
analysisCancelable = new AnalysisRequest.Builder()
//mediaToAnalyze – массив объектов OzAbstractMedia
        .addMedia(mediaToAnalyze) 
        .addAnalysis(new Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaToAnalyze)) //ON_DEVICE для анализа на устройстве
        .build()
//запуск анализов и установка обработчиков
        .run(new AnalysisRequest.AnalysisListener() { 
            @Override
            public void onSuccess(@NonNull RequestResult list) { handleResults(list); } //или ваш обработчик результата
            @Override
            public void onError(@NonNull OzException e) { handleError(e); } //или ваш обработчик ошибок
            @Override
            public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) { handleStatus(analysisStatus); } //или ваш обработчик шагов сценария 
        });
OzLivenessSDK.setApiConnection(null)
OzLivenessSDK.INSTANCE.setApiConnection(null, null);
val isLoggedIn = OzLivenessSDK.isLoggedIn
boolean isLoggedIn = OzLivenessSDK.INSTANCE.isLoggedIn();
OzLivenessSDK.logout()
OzLivenessSDK.INSTANCE.logout();
токен доступа
телеметрии
OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(host, token))
OzLivenessSDK.INSTANCE.setApiConnection(
        OzConnection.Companion.fromServiceToken(host, token), 
        null
);
OzLivenessSDK.setApiConnection(
    OzConnection.fromCredentials(host, username, password),
    statusListener(
        { token -> /* токен */ },
        { ex -> /* ошибка */ }
    )
)
OzLivenessSDK.INSTANCE.setApiConnection(
        OzConnection.Companion.fromCredentials(host, username, password),
        new StatusListener<String>() {
            @Override
            public void onStatusChanged(@Nullable String s) {}
            @Override
            public void onSuccess(String token) { /* токен */ }
            @Override
            public void onError(@NonNull OzException e) { /* ошибка */ }
        }
);
OzLivenessSDK.setEventsConnection(
    OzConnection.fromCredentials(
        "https://echo.cdn.ozforensics.com/",
        "<[email protected]>",
        "your_telemetry_password"
    )
)
OzLivenessSDK.setEventsConnection(
        OzConnection.fromCredentials(
                "https://tm.ozforensics.com/",
                "<[email protected]>",
                "your_telemetry_password"
        )
);

Мастер-лицензия для iOS

Мастер-лицензия – это оффлайн-лицензия, с которой можно использовать мобильные SDK без ограничений по bundle_id, в отличие от обычных лицензий. Для получения мастер-лицензии нужно создать пару ключей, как описано ниже. Отправьте нам публичный ключ по электронной почте, и вскоре после этого мы отправим вам мастер-лицензию. Вашему приложению нужно будет подписать свой bundle_id приватным ключом. Мобильные SDK проверяют подпись с помощью публичного ключа из мастер-лицензии. Действие таких лицензий ограничено по времени.

Генерация ключей

В этом разделе описано, как создавать приватный и публичный ключи.

Создание приватного ключа

Чтобы создать приватный ключ, последовательно запустите следующие команды:

openssl genpkey -algorithm RSA -outform DER -out privateKey.der -pkeyopt rsa_keygen_bits:2048
# for MacOS
base64 -i privateKey.der -o privateKey.txt
# for Linux 
base64 -w 0 privateKey.der > privateKey.txt

Вы получите два файла:

  • privateKey.der – приватный ключ .der;

  • privateKey.txt – privateKey.der в кодировке base64. Содержимое этого файла используется в качестве подписи bundle_id хостового приложения.

Спецификация команд OpenSSL: https://www.openssl.org/docs/man1.1.1/man1/openssl-pkcs8.html

Создание публичного ключа

Чтобы создать публичный ключ, последовательно запустите следующие команды:

openssl rsa -pubout -in privateKey.pem -out publicKey.pub
base64 -w 0 publicKey.pub > publicKey.txt

Вы получите публичный ключ publicKey.pub. Отправьте его нам по электронной почте. В ответ мы пришлем вам лицензию.

Интеграция SDK

Инициализация SDK:

OZSDK(licenseSources: [LicenseSource], masterLicenseSignature: String? = nil, completion: @escaping ((LicenseData?, LicenseError?) -> Void))

Установка лицензии:

setLicense(licenseSource: LicenseSource, masterLicenseSignature: String? = nil)

Перед инициализацией SDK создайте закодированную base64 подпись для bundle_id хостового приложения с помощью приватного ключа.

Пример создания подписи:

private func getSignature() -> String? {
    let privateKeyBase64String = "содержимое файла privateKey.txt"
 
    guard let data = Data(base64Encoded: privateKeyBase64String, options: [.ignoreUnknownCharacters]) else {
      return nil
    }
     
    let sizeInBits = data.count * 8
    let keyDict: [CFString: Any] = [
      kSecAttrKeyType: kSecAttrKeyTypeRSA,
      kSecAttrKeyClass: kSecAttrKeyClassPrivate,
      kSecAttrKeySizeInBits: NSNumber(value: sizeInBits)
    ]
     
    var error: Unmanaged<CFError>?
    guard let secKey = SecKeyCreateWithData(data as CFData, keyDict as CFDictionary, &error) else {
      return nil
    }
     
    guard let bundleID = Bundle.main.bundleIdentifier else {
      return nil
    }
    guard let signature = SecKeyCreateSignature(secKey,
                          .rsaSignatureMessagePKCS1v15SHA512,  // Это критично!!!!
                          Data(bundleID.utf8) as CFData,
                          &error) else {
      return nil
    }
    return (signature as Data).base64EncodedString()
  }
Пример подписи для com.ozforensics.liveness.demo

NcdfzExUuQcdSxdY3MUVp4rUGnJTfeTGh/EN0hqiDUSadxf9jhaYe3EHmBPb+DafWrpvP6h6ZON3fHZcqqlykpWtVlPNr7ZpchPJXgHSdIOetKjPxYWh8xrt0NUSzm9Mymv1vz7UUdLiPFXDbanAedkg4YOX8uVJjfP8gb+suLdeTE3CHm+fdK5IVMP1SMu0XsBiiWBtVZp15l6tz7fDv+frr5kCr8I/LAHo6pCHBtzsXUiYw6ylrU/PHI1QYuyKK96iTxBt3gU+/MrfHl2DHLief3Fs10m3doJmTPizwWi/8h6fvq+6ZZlV/q4S2uPE3gpQZrZe2u3FuSE8gEgVoA==

Передайте подпись как параметр masterLicenseSignature во время инициализации SDK или установки лицензии.

Если подпись невалидна, инициализация продолжится по стандартной схеме: проверка включенных в лицензию bundle_id.

oz-forensics / oz-liveness-android · GitLabGitLab

iOS

Работа с OZ Mobile SDK в операционной системе «iOS»

Чтобы начать пользоваться нашим SDK, нужно выполнить следующие шаги.

  1. Добавьте SDK в проект, как описано здесь.

  2. Получите лицензию на SDK – сгенерируйте тестовую самостоятельно на нашем сайте или запросите «боевую» по электронной почте. Для лицензии потребуется bundle id. Добавьте лицензию в проект, как описано здесь.

  3. Подключите SDK к API. Это необязательный шаг, он выполняется, только если вам нужно обрабатывать какие-либо данные на сервере. Если вы используете режим анализа на устройстве, никакие данные никуда не передаются, и подключение к API не нужно.

  4. Создайте контроллер для съемки, как описано здесь – вы получите медиафайлы, которые потом можно будет отправить на анализ.

  5. Запустите нужные вам проверки для полученных на предыдущем шаге медиафайлов. Здесь описано, как выполнять проверки.

  6. Если вы хотите настроить внешний вид SDK, здесь написано, как это делается.

Ресурсы

Минимальная версия iOS: 11.

Минимальная версия Xcode: 16.

Доступные языки: EN, RU, ES, HY, KK, KY, TR.

Исходный код примера приложения с использованием Oz Liveness SDK расположен в репозитории GitLab:

Список методов и полей SDK:

Актуальную сборку демо-приложения Вы можете загрузить по ссылке.

Oz Forensics API ReferenceOZ-Forensic 6.0.0

Съемка видео

Для старта записи видео используется метод startActivityForResult:

actions – перечень при записи видео.

Для представления Fragment код приведен ниже. LivenessFragment – для экрана Liveness.

Для корректной работы лицензии мы рекомендуем сначала инициализировать SDK, и только потом вызывать открытие экрана Liveness.

Для получения результатов записи видео используется метод onActivityResult:

  • sdkMediaResult – объект с результатами записи видео () для дальнейшего использования при взаимодействии с Oz API.

  • sdkErrorString – описание в случае их возникновения.

Если наш SDK используется только для съемки, пропустите шаг "Выполнение проверок".

Если пользователь прервет запись видео (закроет экран), resultCode примет значение Activity.RESULT_CANCELED.

Пример кода для обработки:

Настройка iOS SDK

Настройка интерфейса

Чтобы настроить интерфейс Oz Liveness, воспользуйтесь OZCustomization. Полный список полей находится .

Обратите внимание: методы настройки интерфейса необходимо вызывать перед методами, запускающими съемку видео.

Oz Liveness Web SDK

Oz Liveness Web SDK представляет собой модуль съемки и отправки медиаданных на анализы из веб-браузера на клиентском устройстве. Поддерживаются все основные браузеры на большинстве устройств. Доступные языки: EN, RU, ES, PT-BR, KK.

Образец кода Oz Liveness Web SDK находится . Чтобы все работало корректно, нужно заменить <web-adapter-url> на полученную от нас ссылку на Web Adapter.

Для Angular и React нужно заменить https://web-sdk.sandbox.ozforensics.com в index.html.

  • Образец кода для

  • Образец кода для

Web SDK только работает по протоколу HTTPS (с SSL-шифрованием); на localhost и 127.0.01 можно использовать HTTP для проверки доступности ресурсов.

Oz Liveness Web SDK состоит из двух частей:

  1. Клиентская – . Используется в виде подгружаемого JavaScript-файла в Frontend-приложении клиента.

  2. Серверная – . Устанавливается в виде отдельного серверного модуля с привязкой к .

Руководства по интеграции:

Oz Web SDK можно развернуть как , так и на наших (SaaS), в последнем случае разворачиваем и поддерживаем программное обеспечение мы, а вы пользуетесь уже готовым и настроенным продуктом. для выбора более удобного варианта.

Для работы Web SDK потребуется информация о доменных именах сайтов, где вы будете его использовать (она необходима для оформления лицензии).

Пошаговая инструкция по использованию Web SDK:

  1. плагин в свою страницу.

  2. Если вы хотите настроить интерфейс Oz Web SDK под себя, рассказано, как это сделать.

Мастер-лицензия для Android

Мастер-лицензия – это оффлайн-лицензия, с которой можно использовать мобильные SDK без ограничений по bundle_id, в отличие от обычных лицензий. Для получения мастер-лицензии нужно создать пару ключей, как описано ниже. Отправьте нам публичный ключ по электронной почте, и вскоре после этого мы отправим вам мастер-лицензию. Вашему приложению нужно будет подписать свой bundle_id приватным ключом. Мобильные SDK проверяют подпись с помощью публичного ключа из мастер-лицензии. Действие таких лицензий ограничено по времени.

Генерация ключей

В этом разделе описано, как создавать приватный и публичный ключи.

Создание приватного ключа

Чтобы создать приватный ключ, последовательно запустите следующие команды:

Вы получите два файла:

  • privateKey.der – приватный ключ .der;

  • privateKey.txt – privateKey.der в кодировке base64. Содержимое этого файла используется в качестве подписи bundle_id хостового приложения.

Спецификация команд OpenSSL:

Создание публичного ключа

Чтобы создать публичный ключ, запустите команду:

Вы получите публичный ключ publicKey.pub. Отправьте его нам по электронной почте. В ответ мы пришлем вам лицензию.

Интеграция SDK

Инициализация SDK:

Для Android 6.0 (API 23) и старше:

  1. Добавьте зависимость implementation 'com.madgag.spongycastle:prov:1.58.0.0';

  2. Перед созданием подписи вызовите Security.insertProviderAt(org.spongycastle.jce.provider.BouncyCastleProvider(), 1)

Перед инициализацией SDK создайте закодированную base64 подпись для bundle_id хостового приложения с помощью приватного ключа.

Пример создания подписи:

Пример подписи для com.ozforensics.liveness.demo

Внимание: данная подпись не соответствует паре ключей, приведенной выше.

Передайте подпись как параметр masterLicenseSignature во время инициализации SDK.

Если подпись невалидна, инициализация продолжится по стандартной схеме: проверка включенных в лицензию bundle_id.

Правила назначения анализов

Анализы могут быть назначены медиафайлам как вручную пользователем – например, через выбор сценария Liveness в приложении – так и автоматически, когда выбор не производится и пользователь запускает все возможные анализы для папки с медиафайлами.

В последнем случае система автоматически определяет, какие именно анализы должны запускаться для того или иного медиафайла. При этом она исходит из того, какие указаны при загрузке файлов. Если файлы загружаются через web-консоль, теги расставляет пользователь, если ведется съемка через SDK – теги проставляются в процессе съемки также автоматически. Также роль играет тип медиафайлов: IMAGE (фото)/VIDEO/SHOTS_SET (приравнивается к видео). Если медиафайл не подходит под требования того или иного анализа, этот анализ такой медиафайл игнорирует.

Список настроек по умолчанию приведен ниже. Для изменения конфигурации, пожалуйста, .

Анализ выполняется для всех медиафайлов вне зависимости от воспроизводимого в них (теги жестов начинаются с video_selfie).

Внимание: в версии API 4.0.8 и ниже, чтобы отправить на анализ Quality (Liveness) изображение, а не видео, необходимо поместить его в архив .zip, установить тип файла SHOTS_SET и поставить один из тегов video_, иначе Quality изображение проигнорирует.

Анализ выполняется для всех фото и видео.

Если в папке будет менее двух подходящих медиафайлов, система вернет ошибку. Если более двух, то будут сравниваться все возможные пары, и система выдаст результат по паре с наименьшим сходством.

Анализ выполняется только при наличии заранее созданного черного списка для всех присутствующих в папке / указанных в качестве источника фото и видео.

Это дополнительная опция к анализу Quality. Анализ выполняется для всех медиафайлов, подходящих для анализа Quality. Соответствующую настройку можно отключить.

Documents

Сверка лица с документами (анализ “Documents”) выполняется для медиафайлов с тегами photo_id_front, photo_id_back (документы) и photo_selfie (селфи). Результат сверки будет положительным, если есть фото лица и хотя бы один валидный документ (с фотографией того же лица) из списка ниже:

  • паспорт

  • водительские права

  • заграничный паспорт

Связанные с тегами ошибки

// параметры настройки верхней панели
let toolbarCustomization = ToolbarCustomization(
   closeButtonIcon: UIImage(named: "example"),
   closeButtonColor: .black.withAlphaComponent(0.8),
   titleText: "",
   titleFont: .systemFont(ofSize: 18, weight: .regular),
   titleColor: .gray,
   backgroundColor: .lightGray)

// параметры настройки текста подсказки
let centerHintCustomization = CenterHintCustomization(textColor: .white,
    textFont: .systemFont(ofSize: 22, weight: .regular),
    verticalPosition: 42,
    backgroundColor: UIColor.init(hexRGBA: "1C1C1E8F")!,
    hideTextBackground: false,
    backgroundCornerRadius: 14)
   
// параметры настройки анимации подсказки
let hintAnimationCustomization = HintAnimationCustomization(
    hideAnimation: false,
    animationIconSize: 80,
    toFrameGradientColor: UIColor.red)

// параметры настройки рамки вокруг лица
let faceFrameCustomization = FaceFrameCustomization(
   strokeWidth: 4,
   strokeFaceAlignedColor: .green,
   strokeFaceNotAlignedColor: .red,
   geometryType = .rect(cornerRadius: 10),
   strokePadding: 3)

// параметры настройки текста версии SDK
let versionCustomization = VersionLabelCustomization(
   textFont: .systemFont(ofSize: 13, weight: .regular),
   textColor: .gray
)

// параметры настройки фона за рамкой
let backgroundCustomization = BackgroundCustomization(
   backgroundColor: .lightGray
)

// параметры настройки защиты от мошенников
let antiscamCustomization: AntiscamCustomization = AntiscamCustomization(
  customizationEnableAntiscam: false,
  customizationAntiscamTextMessage: "Face recognition",
  customizationAntiscamTextFont: UIFont.systemFont(ofSize: 15, weight: .semibold),
  customizationAntiscamTextColor: UIColor.black,
  customizationAntiscamBackgroundColor: UIColor.init(hexRGBA: "F2F2F7FF")!,
  customizationAntiscamCornerRadius: 18,
  customizationAntiscamFlashColor: UIColor.init(hexRGBA: "FF453AFF")!)

// параметры настройки логотипа,
// если лицензия предусматривает возможность его изменения
let logoCustomization = LogoCustomization(image: UIImage(), size: CGSize(width: 100, height: 100))

OZSDK.customization = Customization(toolbarCustomization: toolbarCustomization,
                   antiscamCustomization: antiscamCustomization,
                   centerHintCustomization: centerHintCustomization,
                   hintAnimationCustomization: hintAnimationCustomization,
                   faceFrameCustomization: faceFrameCustomization,
                   versionCustomization: vesrionCustomization,
                   backgroundCustomization: backgroundCustomization,
                  logoCustomization: logoCustomization)
здесь
openssl genpkey -algorithm RSA -outform DER -out privateKey.der -pkeyopt rsa_keygen_bits:2048
# for MacOS
base64 -i privateKey.der -o privateKey.txt
# for Linux 
base64 -w 0 privateKey.der > privateKey.txt
openssl rsa -pubout -in privateKey.der -out publicKey.pub
fun init(
    context: Context,
    licenseSources: List<LicenseSource>,
    masterLicenseSignature: String,
    statusListener: StatusListener<LicensePayload>? = null,
 )
private fun getMasterSignature(): String {
    Security.insertProviderAt(org.spongycastle.jce.provider.BouncyCastleProvider(), 1)

    val privateKeyBase64String = "содержимое файла privateKey.txt"

    val sig = Signature.getInstance("SHA512WithRSA")
    val keySpec = PKCS8EncodedKeySpec(Base64.decode(privateKeyBase64String, Base64.DEFAULT))
    val keyFactory = KeyFactory.getInstance("RSA")
    sig.initSign(keyFactory.generatePrivate(keySpec))
    sig.update(packageName.toByteArray(Charsets.UTF_8))
    return Base64.encodeToString(sig.sign(), Base64.DEFAULT).replace("\n", "")
 }
KohJ1rsUgLMzZHpHGAZDK2efHPnMj9tw9VIedBLvyZt0B2JH3SWfJLJ8X6JNz3bR2sce6PR2wdEIFln0r1pUnD+6WBCgexKIHAv7esiRVQZoZOEANDBwDvJVv73H/0qL2LGlhxKzbBg5CxGPClTBQdLo1P+7HsTXHHG/Hf6m3rdu1OUeGXVPoaS2NzE8kiRH6gb8Nhr7PBLTUeMKTeLoiX13hvwjOqhV1ANhgS97T4hC2+ZilZt4RektgRY/+fGmWnOqErNeYuz/WSInfaJS0YEWhJW3gXKPjdCzNGIBIqbxaFSjU46wu/alh2+tBRFnrYFl1dRQVcTlW0VwwZHcug==
https://www.openssl.org/docs/man1.1.1/man1/openssl-pkcs8.html

Код ошибки

Сообщение

Описание

202

Could not locate face on source media [media_id]

Лицо на медиа не найдено. Это может быть результатом неправильно выставленных (например photo_id_back) или отсутствующих тегов.

202

Biometry. Analyse requires at least 2 media objects to process

Алгоритмы не нашли хотя бы двух файлов для сравнения. Возможно, найден только один медиафайл или медиафайлам не установлены теги.

202

Processing error - did not found any document candidates on image

Документы на прилагаемых медиа не найдены – либо подгружено не фото документа, либо теги подгруженных медиафайлов отсутствуют / некорректны (не содержат photo_id в начале).

5

Invalid/missed tag values to process quality check

Установленные для медиафайлов теги относятся к тем, которые анализ Quality игнорирует (скорее всего, они начинаются с photo_, а не video_*).

5

Invalid/missed tag values to process blacklist check

Установленные для медиафайлов теги не могут быть обработаны алгоритмами Blacklist. Возможно, медиафайлам не установлены теги.

теги
напишите нам
Quality (Liveness)
жеста
Biometry
Blacklist
Best Shot
when (resultCode) {
    Activity.RESULT_CANCELED -> *USER CLOSED THE SCREEN*
    OzLivenessResultCode.SUCCESS -> {
        val sdkMediaResult = OzLivenessSDK.getResultFromIntent(data)
        *SUCCESS*
    }
    else -> {
        val errorMessage = OzLivenessSDK.getErrorFromIntent(data)
        *FAILURE*
    }
}
действий пользователя
Fragment
OzAbstractMedia
ошибок
val intent = OzLivenessSDK.createStartIntent(listOf(OzAction.Smile, OzAction.Blank))
startActivityForResult(intent, REQUEST_CODE)
List<OzAction> actions  = Arrays.asList(OzAction.Smile, OzAction.Scan);
Intent intent = OzLivenessSDK.createStartIntent(actions);
startActivityForResult(intent, REQUEST_CODE);
childFragmentManager.beginTransaction()
    .replace(R.id.content, LivenessFragment.create(actions))
    .commit()
// подписка на результат Fragment
childFragmentManager.setFragmentResultListener(OzLivenessSDK.Extra.REQUEST_CODE, this) { _, result ->
    when (result.getInt(OzLivenessSDK.Extra.EXTRA_RESULT_CODE)) {
        OzLivenessResultCode.SUCCESS -> { /* запуск анализа */ }
        else -> { /* вывод ошибки */ }  
    }
}
getSupportFragmentManager().beginTransaction()
        .replace(R.id.content, LivenessFragment.Companion.create(actions, null, null, false))
        .addToBackStack(null)
        .commit();
// подписка на результат Fragment
getSupportFragmentManager().setFragmentResultListener(OzLivenessSDK.Extra.REQUEST_CODE, this, (requestKey, result) -> {
            switch (result.getInt(OzLivenessSDK.Extra.EXTRA_RESULT_CODE)) {
                case OzLivenessResultCode.SUCCESS: {/* запуск анализа */}
                default: {/* вывод ошибки */}
            }
        });
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE) {
      sdkMediaResult = OzLivenessSDK.getResultFromIntent(data)
      sdkErrorString = OzLivenessSDK.getErrorFromIntent(data)
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @androidx.annotation.Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE) {
        List<OzAbstractMedia> sdkMediaResult = OzLivenessSDK.INSTANCE.getResultFromIntent(data);
        String sdkErrorString = OzLivenessSDK.INSTANCE.getErrorFromIntent(data);
    }
Logo
Методы и поля iOS SDK
здесь
Angular
React
Oz Liveness Web Plugin
Oz Liveness Web Adapter
Oz API
на ваших серверах
Свяжитесь с нами
Интегрируйте
здесь
  1. Работа на ваших серверах

  • Установите Web SDK. Вам помогут наши инженеры. Лицензия также будет установлена в этот момент. Когда вам потребуется ее обновить, воспользуйтесь .

  • Настройте .

  1. SaaS

  • Ничего делать не нужно, установку и настройку серверной части обеспечивают инженеры Oz Forensics. Вы получите ссылку для интеграции (см. п. 2).

Как интегрировать серверную проверку Liveness в ваше Web-приложение
Как добавить съемку документа и возможность сопоставления лиц в ваше веб- или мобильное приложение

Объекты системы

Иерархия объектов

Объекты системы имеют иерархическую структуру подчинения.

  1. На верхнем уровне находится Компания. Это значит, что один экземпляр установки Oz API может обслуживать пользователей нескольких не зависящих друг от друга компаний.

  2. Пользователь является инициатором любого запроса. В зависимости от пользователя могут присутствовать определенные ограничения на те или иные действия.

  3. При выполнении Пользователем запроса на Анализ система автоматически создает Папку, помещает туда все отправленные пользователем Медиафайлы, а затем запускает собственно (один или несколько). Анализы применяются к медиафайлам из папки в соответствии с . Требования к медиафайлам перечислены .

Поля объектов

Каждый объект имеет набор полей для работы и идентификации на уровне REST API запросов.

Общие поля

Объект Компания

Объект Пользователь

Объект Папка

Объект Медиа

Объект Анализ

Установка и использование плагина для Flutter

Образец кода для Flutter вы можете найти .

Установка и лицензирование

Добавьте строки из блока ниже в pubspec.yaml проекта, где планируется использовать плагин.

Поместите файл лицензии (например, license.json или forensics.license) в папку Flutter application/assets. В pubspec.yaml добавьте asset:

Для Android укажите путь к репозиторию Oz в /android/build.gradle, раздел allprojects → repositories:

Для Flutter 8.24.0 и новее или Android Gradle plugin 8.0.0 и новее добавьте строку в android/gradle.properties:

Минимальная версия SDK – 21 или выше:

Для iOS в Runner → Info → Deployment target → iOS Deployment Target установите версию 13 или выше.

В ios/Podfile закомментируйте строку use_frameworks! (#use_frameworks!).

Начало работы с Flutter

Инициализация SDK

Для инициализации вызовите метод init. Название и путь к файлу лицензии должны совпадать с теми, которые вы указали в pubspec.yaml (например, assets/license.json).

Подключение SDK к API

Для подключения используйте полученные от нас логин, пароль и адрес API сервера.

На стадии коммерческого использования вместо логина и пароля мы рекомендуем использовать токен доступа, который можно получить с помощью метода API /api/authorize/auth.

По умолчанию логи сохраняются вместе с данными по анализам. Если вы планируете хранить логи отдельно от этих данных, настройте отдельное подключение для :

или

Съемка видео

Для запуска съемки и получения результата вызовите метод startLiveness:

Обратите внимание: для версий до 8.11 включительно метод для запуска называется executeLiveness. Он возвращает результат съемки.

Для получения результата съемки в версии 8.12 и новее подпишитесь на livenessResult, как показано ниже:

Выполнение проверок

Размещенный ниже код поможет вам запустить анализы.

Создайте объект Analysis:

Запустите созданный анализ:

Если вы хотите запустить анализ для конкретной папки, укажите ее идентификатор:

Результат анализа запишется в массив объектов analysisResult.

Для анализа медиафайла, полученного не нашим SDK, используйте следующий код:

Итоговый блок кода (пример):

этой статьей
Web Adapter
  ozsdk:
    git:
      url: https://gitlab.com/oz-forensics/oz-mobile-flutter-plugin.git
      ref: '8.8.2'
assets
  - assets/license.json // название файла лицензии должно совпадать с названием из папки assets
allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url ‘https://ozforensics.jfrog.io/artifactory/main’ } // ссылка на репозиторий
    }
}
android.nonTransitiveRClass=false
defaultConfig {
  ...
  minSDKVersion 21
  ...
}
await OZSDK.initSDK([<% название файла лицензии и путь к нему %>]);
await OZSDK.setApiConnectionWithCredentials(<login>, <password>, <host>);
 await OZSDK.setApiConnectionWithToken(token, host);
await OZSDK.setEventConnectionWithCredentials(<login>, <password>, <host>);
await OZSDK.setEventConnectionWithToken(<token>, <host>);
await OZSDK.startLiveness(<actions>, <use_main_camera>);

Параметр

Тип

Описание

actions

List<VerificationAction>

Действия на видео

use_main_camera

Boolean

Если установлено True, используется основная камера, False – передняя

class Screen extends StatefulWidget {
  static const route = 'liveness';

  const Screen({super.key});

  @override
  State<Screen> createState() => _ScreenState();
}

class _ScreenState extends State<Screen> {
  late StreamSubscription<List<Media>> _subscription;

  @override
  void initState() {
    super.initState();

    // подписка на результат liveness
    _subscription = OZSDK.livenessResult.listen(
      (List<Media> medias) {
          // содержит медиафайл liveness
      },
      onError: (Object error) {
        // обработка ошибок, чаще всего PlatformException
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    // пропущено для сокращения образца кода
  }

  void _startLiveness() async {
    // запустите экран съемки с помощью метода startLiveness
    OZSDK.startLiveness(<list of actions>);
  }

  @override
  void dispose() {
    // cancel subscription
    _subscription.cancel();
    super.dispose();
  }
}
List<Analysis> analysis = [ Analysis(Type.quality, Mode.serverBased, <media>, {}), ];
final analysisResult = await OZSDK.analyze(analysis, [], {});
final analysisResult = await OZSDK.analyze(analysis, folderID, [], {});
media = Media(FileTypedocumentPhoto, VerificationAction.oneShot, “photo_selfie”, null, <pat
// замените VerificationAction.blank, если у вас используется другой жест Livenes
final cameraMedia = await OZSDK.executeLiveness([VerificationAction.blank], use_main_camera);

final analysis = [
  Analysis(Type.quality, Mode.serverBased, cameraMedia, {}),
];

final analysisResult = await OZSDK.analyze(analysis, [], {});
// замените VerificationAction.blank, если у вас используется другой жест Liveness
final cameraMedia = await OZSDK.executeLiveness([VerificationAction.blank], use_main_camera);
final biometryMedia = [...cameraMedia];
biometryMedia.add(
  Media(
    FileType.documentPhoto,
    VerificationAction.blank,
    MediaType.movement,
    null,
    <путь к референсному фото>,
    null,
    null,
    MediaTag.photoSelfie,
  ),
);

final analysis = [
  Analysis(Type.quality, Mode.serverBased, cameraMedia, {}),
  Analysis(Type.biometry, Mode.serverBased, biometryMedia, {}),
];

final analysisResult = await OZSDK.analyze(analysis, [], {});
здесь
телеметрии

Поле

Тип

Описание

time_created

Timestamp

время создания объекта (кроме пользователя и компании)

time_updated

Timestamp

время изменения объекта

meta_data

Json

любые пользовательские поля

technical_meta_data

Json

технические поля, зарезервированные для работы модулей

Поле

Тип

Описание

company_id

UUID

код компании в системе

name

String

наименование компании в системе

Поле

Тип

Описание

user_id

UUID

код пользователя в системе

user_type

String

роль пользователя в системе

first_name

String

имя

last_name

String

фамилия

middle_name

String

отчество

email

String

email, который является логином пользователя

password

String

пароль, указывается при добавлении нового пользователя или при изменении пароля. Если роль пользователя не admin, необходимо указать поле password_old

can_start_analyze_*

String

см. роли пользователей

company_id

UUID

код компании пользователя

is_admin

Boolean

флаг админа

is_service

Boolean

флаг сервисного пользователя

Поле

Тип

Описание

folder_id

UUID

код папки в системе

resolution_status

ResolutionStatus

статус последнего анализа папки

Поле

Тип

Описание

media_id

UUID

код медиа

original_name

String

оригинальное имя файла (в файловой системе клиента)

original_url

Url

HTTP-ссылка на файл на сервере API

tags

Array(String)

список тегов для этого файла

Поле

Тип

Описание

analyse_id

UUID

код анализа

folder_id

UUID

код папки

type

String

тип анализа (BIOMETRY\QUALITY\DOCUMENTS)

results_data

Json

данные результата анализа

роли
Анализ
Правилами назначения анализов
здесь
Logo

Настройка Android SDK

Настройки Oz Mobile SDK

Применять настройки рекомендуется при старте приложения.

Настройка интерфейса Oz Mobile SDK

Чтобы настроить интерфейс Oz Liveness, воспользуйтесь UICustomization. Полный список полей находится .

По умолчанию SDK использует локаль устройства. Чтобы сменить локаль, используйте код ниже:

Запуск плагина

Перед запуском убедитесь, что скрипты плагина загружены.

Для запуска окна плагина следует воспользоваться методом open(options). Параметры:

  • options – объект с настройками:

    • token – (опционально) токен авторизации;

    • license – объект с информацией о лицензии;

    • licenseUrl – строка, содержащая путь к файлу лицензии;

    • lang – строка с идентификатором одного из подключенных языковых пакетов;

    • meta – объект, ключи которого являются названиями метаполей, а значения – их строковыми значениями. передаются в Oz API и могут быть использованы для получения результатов анализа или поиска;

    • params – объект с идентификаторами и значениями дополнительных параметров:

      • extract_best_shot: true/false – запуск выбора лучшего кадра в анализе ;

    • action – массив строк с идентификаторами действий, по которым будет проводиться проверка. Доступные действия:

      • photo_id_front – фото лицевой стороны документа;

      • photo_id_back – фото обратной стороны документа;

      • video_selfie_left – поворот головы налево;

      • video_selfie_right – поворот головы направо;

      • video_selfie_down – наклон головы вниз;

      • video_selfie_high – поднятие головы вверх;

      • video_selfie_smile – улыбка;

      • video_selfie_eyes – моргание;

      • video_selfie_scan – сканирование;

      • video_selfie_blank – отсутствие действия, простое селфи.

      • video_selfie_best – специальное действие, которое извлекает из видео лучший кадр и выполняет анализ по нему вместо целого видео.

    • overlay_options – параметры отображения шаблона документа:

      • show_document_pattern: true/false – по умолчанию true, отображает картинку-шаблон, при значении false остается только прямоугольная рамка;

    • on_submit – callback-функция без аргументов, вызываемая после отправки пользовательских данных на сервер (не применяется в ).

    • on_capture_complete – callback-функция с одним аргументом, вызываемая по завершении съемки и возвращающая информацию о снятом видео. Пример возвращаемого объекта показан .

    • on_complete – callback-функция с одним аргументом, вызываемая после окончания проверки и возвращающая результат анализа (не применяется в режиме capture). Вид результата зависит от параметра Web Adapter result_mode. Описание результата .

    • on_result – callback-функция с одним аргументом, вызываемая раз в несколько секунд в процессе анализа и возвращающая промежуточный результат (не применяется в режиме capture). Вид результата зависит от параметра Web Adapter result_mode. Описание результата .

    • on_error – callback-функция с одним аргументом, вызываемая при ошибке во время съемки и возвращающая информацию об ошибке: код ошибки, сообщение, идентификатор телеметрии для журналирования.

    • on_close – callback-функция без аргументов, вызываемая по окончании проверки после закрытия окна плагина, как ручного, так и автоматического.

    • style – раздел для .

    • device_id – (опционально) идентификатор используемой камеры.

    • enable_3d_mask (с версии 1.2.1) – включает использование 3D-маски при съемке вместо овала. Параметр работает только при load_3d_mask= true в ; значение по умолчанию – false.

    • cameraFacingMode (добавлено в 1.4.0) – параметр, определяющий, какую камеру использовать; возможные значения: user (передняя камера), environment (задняя камера). Этот параметр работает только в том случае, когда для параметра use_for_liveness в не установлено значение. Если use_for_liveness установлено любое значение, cameraFacingMode игнорируется.

    • disable_adaptive_aspect_ratio (добавлено в 1.5.0) – выключает автоматическую подстройку соотношения сторон видео к соотношению сторон окна. Значение по умолчанию – False, при стандартных настройках видео подстраивается под ближайшее соотношение из списка: 4:3, 3:4, 16:9, or 9:16. Обратите внимание: для съемки видео на смартфонах нужна портретная ориентация.

    • get_user_media_timeout (добавлено в 1.5.0) – когда SDK не может получить доступ к камере, по истечении этого таймаута появится подсказка, как решить проблему. Значение по умолчанию – 40000 (мс).

    • С помощью следующих параметров (добавлены в 1.7.15) вы можете управлять поведением SDK при зависании getUserMedia():

      • get_user_media_promise_timeout_ms – по истечении установленного здесь таймаута (в мс) SDK вызовет ошибку или покажет инструкцию для пользователя. Этот параметр представляет собой объект с ключами: "platform_browser", "browser", "platform", "default"(приоритет соответствует последовательности).

      • get_user_media_promise_timeout_throw_error – определяет, что именно демонстрирует SDK после таймаута, ошибку (если true) или инструкцию (если false).

Пример:

OzLiveness.open({
    lang: 'en',
    action: [
        'video_selfie_blank',
    ],
    meta: { // если нужно, добавьте метаданные для папки
        'transaction_id': 'your unique transaction identifier', // идентификатор транзакции для поиска через Oz API
        'end_user_id': '<user_or_lead_id>',
        'meta_key': 'meta_value',
    },
    on_result: function (result) {
        console.log('on_result', result);
    },
    on_complete: function (result) {
        console.log('on_complete', result);
    },
    on_close: function () {
        console.log('on_close');
    },
    on_capture_complete: function (result) {
        console.log('on_capture_complete', result);
    }
});
Метаданные
Quality
режиме capture
здесь
настройки
здесь
настройки
здесь
настройки интерфейса
настройках конфигурации адаптера
файле конфигурации Web Adapter
OzLivenessSDK.INSTANCE.getConfig().setCustomization(new UICustomization(
// параметры настройки верхней панели
new ToolbarCustomization(
    R.drawable.ib_close,
    new Color.ColorRes(R.color.white),
    R.style.Sdk_Text_Primary,
    new Color.ColorRes(R.color.white),
    R.font.roboto,
    Typeface.NORMAL,
    100, // непрозрачность текста на верхней панели (в %)
    18, // размер текста на верхней панели (в sp)
    new Color.ColorRes(R.color.black),
    60, // непрозрачность фона верхней панели (в %)
        "Liveness", // текст на верхней панели
    true // центрировать текст на верхней панели
    ),
// параметры настройки текста подсказки
new CenterHintCustomization(
    50, // положение по вертикали (в %)
    R.style.Sdk_Text_Primary,
    R.drawable.bg_center_hint_badge,
    new Color.ColorRes(R.color.color_surface),
    100, // непрозрачность фона
    14, // угловой радиус подложки
    100 // непрозрачность текста
    ),
// параметры настройки анимации подсказки
new HintAnimation(
    new Color.ColorRes(R.color.red), // цвет градиента
    80, // непрозрачность цвета градиента (в %)
    120, // размер квадрата, в который вписан значок анимации
    false // скрывать ли анимацию
    ),
// параметры настройки рамки вокруг лица
new FaceFrameCustomization(     GeometryType.RECTANGLE,
    10, // угловой радиус для прямоугольника
    new Color.ColorRes(R.color.error_red), 
    new Color.ColorRes(R.color.success_green),
    100, // непрозрачность рамки (в %)
    5, // ширина линии рамки (в dp)
    3 // отступ от рамки до области для позиционирования лица (в dp)
    ),
// параметры настройки фона за рамкой
new BackgroundCustomization(
    new Color.ColorRes(R.color.black),
    60 // непрозрачность фона (в %)
    ),
// параметры настройки текста версии SDK
new VersionTextCustomization(
    R.style.Sdk_Text_Primary,
    R.font.roboto,
    12, // размер шрифта текста версии (в sp)
    new Color.ColorRes(R.color.white),
    100 // непрозрачность текста версии (в %)
    ),
// параметры настройки дополнительной защиты от мошенничества
new AntiScamCustomization(
     "Recording .. ",
    R.font.roboto,
    12,
    new Color.ColorRes(R.color.text_color),
    100,
    R.style.Sdk_Text_Primary,
    new Color.ColorRes(R.color.color_surface),
    100,
    14,
    new Color.ColorRes(R.color.green)
    ),
// параметры настройки логотипа
new LogoCustomization(
    new Image.Drawable(R.drawable.ic_logo),
    new Size(176, 64)
    )
 )
);
OzLivenessSDK.config.localizationCode = OzLivenessSDK.OzLocalizationCode.RU
OzLivenessSDK.INSTANCE.getConfig().setLocalizationCode(OzLivenessSDK.OzLocalizationCode.RU);
здесь
// подключение к серверу API
OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(HOST, TOKEN))
// настройка количества попыток обнаружить действие
OzLivenessSDK.config.attemptSettings = attemptSettings 
// возможность отображения дополнительной информации для отладки (чтобы увидеть данные, нажмите на номер версии SDK)
OzLivenessSDK.config.allowDebugVisualization = allowDebugVisualization 
// настройки журналирования
OzLivenessSDK.config.logging = ozLogging 
OzConfig config = OzLivenessSDK.INSTANCE.getConfig();
// подключение к серверу API
OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(HOST, TOKEN));
// настройка количества попыток обнаружить действие
config.setAttemptSettings(attemptSettings); 
// возможность отображения дополнительной информации для отладки (чтобы увидеть данные, нажмите на номер версии SDK)
config.setAllowDebugVisualization(allowDebugVisualization); 
// настройки журналирования
config.setLogging(ozLogging);
OzLivenessSDK.config.customization = UICustomization(
    // параметры настройки верхней панели
    toolbarCustomization = ToolbarCustomization(
        closeIconRes = R.drawable.ib_close,
        closeIconTint = Color.ColorRes(R.color.white),
        titleTextFont = R.font.roboto,
        titleTextSize = 18,
        titleTextAlpha = 100,
        titleTextColor = Color.ColorRes(R.color.white),
        backgroundColor = Color.ColorRes(R.color.black),
        backgroundAlpha = 60,
        isTitleCentered = true,
        title = "Analysis"
    ),
    // параметры настройки текста подсказки
    centerHintCustomization = CenterHintCustomization(
        textFont = R.font.roboto,
        textColor = Color.ColorRes(R.color.text_color),
        textSize = 20,
        verticalPosition = 50,
        textStyle = R.style.Sdk_Text_Primary,
        backgroundColor = Color.ColorRes(R.color.color_surface),
        backgroundOpacity = 56,
        backgroundCornerRadius = 14,
        textAlpha = 100
    ),
    // параметры настройки анимации подсказки
    hintAnimation = HintAnimation(
    hintGradientColor = Color.ColorRes(R.color.red),
    hintGradientOpacity = 80,
    animationIconSize = 120,
    hideAnimation = false
),
    // параметры настройки рамки вокруг лица
    faceFrameCustomization = FaceFrameCustomization(
        geometryType = GeometryType.Rectangle(10), // 10 – радиус скругления углов
        strokeDefaultColor = Color.ColorRes(R.color.error_red),
        strokeFaceInFrameColor = Color.ColorRes(R.color.success_green),
        strokeAlpha = 100,
        strokeWidth = 5,
        strokePadding = 3,
    ),
    // параметры настройки фона за рамкой
    backgroundCustomization = BackgroundCustomization(
        backgroundColor = Color.ColorRes(R.color.black),
        backgroundAlpha = 60
    ),
    // параметры настройки текста версии SDK
    versionTextCustomization = VersionTextCustomization(
        textFont = R.font.roboto,
        textSize = 12,
        textColor = Color.ColorRes(R.color.white),
        textAlpha = 100,
    ),
    // параметры настройки дополнительной защиты от мошенничества
    antiScamCustomization = AntiScamCustomization(
        textMessage = "",
        textFont = R.font.roboto,
        textSize = 14,
        textColor = Color.ColorRes(R.color.text_color),
        textAlpha = 100,
        backgroundColor = Color.ColorRes(R.color.color_surface),
        backgroundOpacity = 100,
        cornerRadius = 20,
        flashColor = Color.ColorRes(R.color.green)
    ),
    // параметры настройки логотипа,
    // если лицензия предусматривает возможность его изменения
    logoCustomization = LogoCustomization(
        image = Image.Drawable(R.drawable.ic_logo),
        size = Size(176, 64),
    )
)

Съемка видео и описание коллбэка on_capture_complete

В этом разделе вы узнаете, как снимать видео и отправлять его Oz API через ваш бэкенд.

1. Обзор

Режим capture работает следующим образом:

1. Oz Web SDK снимает видео и передает его вашему web-приложению в виде последовательности кадров.

2. Web-приложение вызывает ваш бэкэнд и передает в него архив с кадрами.

3. После обработки видео ваш бэкэнд вызывает Oz API для выполнения анализов, после чего получает их результаты.

4. Ваш бэкэнд передает результаты обратно в web-приложение (опционально).

2. Реализация

На стороне сервера необходимо сконфигурировать Web SDK для работы в режиме capture: установить параметру architecture в файле app_config.json значение capture.

В вашем web-приложении добавьте callback-функцию для обработки кадров при открытии плагина Web SDK:

OZLiveness.open({
  ... // другие параметры
  on_capture_complete: function(result) {
         // Код для обработки кадров / отправки его через ваш API, шаг 2 на схеме
  }
})

Структура получаемого объекта зависит от того, была ли обнаружена виртуальная камера.

Виртуальная камера не обнаружена

{
	"action": <action>,
	"best_frame": <bestframe>,
	"best_frame_png": <bestframe_png>,
	"best_frame_bounding_box": {
		"left": <bestframe_bb_left>,
		"top": <bestframe_bb_top>,
		"right": <bestframe_bb_right>,
		"bottom": <bestframe_bb_bottom>
		},
	"best_frame_landmarks": {
		"left_eye": [bestframe_x_left_eye, bestframe_y_left_eye],
		"right_eye": [bestframe_x_right_eye, bestframe_y_right_eye],
		"nose_base": [bestframe_x_nose_base, bestframe_y_nose_base],
		"mouth_bottom": [bestframe_x_mouth_bottom, bestframe_y_mouth_bottom],
		"left_ear": [bestframe_x_left_ear, bestframe_y_left_ear],
		"right_ear": [bestframe_x_right_ear, bestframe_y_right_ear]
		},
	"frame_list": [<frame1>, <frame2>],
	"frame_bounding_box_list": [
		{
		"left": <frame1_bb_left>,
		"top": <frame1_bb_top>,
		"right": <frame1_bb_right>,
		"bottom": <frame1_bb_bottom>
		},
		{
		"left": <frame2_bb_left>,
		"top": <frame2_bb_top>,
		"right": <frame2_bb_right>,
		"bottom": <frame2_bb_bottom>
		},
	],
	"frame_landmarks": [
		{
		"left_eye": [frame1_x_left_eye, frame1_y_left_eye],
		"right_eye": [frame1_x_right_eye, frame1_y_right_eye],
		"nose_base": [frame1_x_nose_base, frame1_y_nose_base],
		"mouth_bottom": [frame1_x_mouth_bottom, frame1_y_mouth_bottom],
		"left_ear": [frame1_x_left_ear, frame1_y_left_ear],
		"right_ear": [frame1_x_right_ear, frame1_y_right_ear]
		},
		{
		"left_eye": [frame2_x_left_eye, frame2_y_left_eye],
		"right_eye": [frame2_x_right_eye, frame2_y_right_eye],
		"nose_base": [frame2_x_nose_base, frame2_y_nose_base],
		"mouth_bottom": [frame2_x_mouth_bottom, frame2_y_mouth_bottom],
		"left_ear": [frame2_x_left_ear, frame2_y_left_ear],
		"right_ear": [frame2_x_right_ear, frame2_y_right_ear]
		}
	],
"from_virtual_camera": null,
"additional_info": <additional_info>
}

Виртуальная камера обнаружена

{
	"action": <action>,
	"best_frame": null,
	"best_frame_png": null,
	"best_frame_bounding_box": null,
	"best_frame_landmarks": null
	"frame_list": null,
	"frame_bounding_box_list": null,
	"frame_landmarks": null,
	"from_virtual_camera": {
	"additional_info": <additional_info>,
		"best_frame": <bestframe>,
		"best_frame_png": <best_frame_png>,
		"best_frame_bounding_box": {
			"left": <bestframe_bb_left>,
			"top": <bestframe_bb_top>,
			"right": <bestframe_bb_right>,
			"bottom": <bestframe_bb_bottom>
			},
		"best_frame_landmarks": {
			"left_eye": [bestframe_x_left_eye, bestframe_y_left_eye],
			"right_eye": [bestframe_x_right_eye, bestframe_y_right_eye],
			"nose_base": [bestframe_x_nose_base, bestframe_y_nose_base],
			"mouth_bottom": [bestframe_x_mouth_bottom, bestframe_y_mouth_bottom],
			"left_ear": [bestframe_x_left_ear, bestframe_y_left_ear],
			"right_ear": [bestframe_x_right_ear, bestframe_y_right_ear]
			},
		"frame_list": [<frame1>, <frame2>],
		"frame_bounding_box_list": [
			{
			"left": <frame1_bb_left>,
			"top": <frame1_bb_top>,
			"right": <frame1_bb_right>,
			"bottom": <frame1_bb_bottom>
			},
			{
			"left": <frame2_bb_left>,
			"top": <frame2_bb_top>,
			"right": <frame2_bb_right>,
			"bottom": <frame2_bb_bottom>
			},
			],
		"frame_landmarks": [
			{
			"left_eye": [frame1_x_left_eye, frame1_y_left_eye],
			"right_eye": [frame1_x_right_eye, frame1_y_right_eye],
			"nose_base": [frame1_x_nose_base, frame1_y_nose_base],
			"mouth_bottom": [frame1_x_mouth_bottom, frame1_y_mouth_bottom],
			"left_ear": [frame1_x_left_ear, frame1_y_left_ear],
			"right_ear": [frame1_x_right_ear, frame1_y_right_ear]
			},
			{
			"left_eye": [frame2_x_left_eye, frame2_y_left_eye],
			"right_eye": [frame2_x_right_eye, frame2_y_right_eye],
			"nose_base": [frame2_x_nose_base, frame2_y_nose_base],
			"mouth_bottom": [frame2_x_mouth_bottom, frame2_y_mouth_bottom],
			"left_ear": [frame2_x_left_ear, frame2_y_left_ear],
			"right_ear": [frame2_x_right_ear, frame2_y_right_ear]
			}
		]
	}
}

Список переменных с их значениями приведен ниже.

Переменная

Тип

Описание

best_frame

String

Лучший кадр, JPEG в формате data URL

best_frame_png

String

Лучший кадр, PNG в формате data URL, необходим для защиты от подмены видеопотока с помощью виртуальной камеры

best_frame_bounding_box

Array[Named_parameter: Int]

Координаты прямоугольника, в который вписано лицо на лучшем кадре

best_frame_landmarks

Array[Named_parameter: Array[Int, Int]]

Координаты "ориентиров" лица (левый глаз, правый глаз, нос, рот, левое ухо, правое ухо) на лучшем кадре

frame_list

Array[String]

Все кадры в формате data URL

frame_bounding_box_list

Array[Array[Named_parameter: Int]]

Координаты прямоугольников, в которые вписано лицо на кадрах из frame_list в соответствующем порядке

frame_landmarks

Array[Named_parameter: Array[Int, Int]]

Координаты "ориентиров" лица (левый глаз, правый глаз, нос, рот, левое ухо, правое ухо) на кадрах из frame_list в соответствующем порядке

action

String

Код действия

additional_info

String

Информация о среде клиента

Обратите внимание:

  • Видео, полученное через Oz Web SDK, – это последовательность кадров. Чтобы отправить его Oz API, поместите кадры в ZIP-архив, затем используйте метод POST {{host}}/api/folders (пройдите по ссылке для ознакомления с коллекцией Postman).

  • Вы можете получить из папки видео в формате MP4 video: вызовите метод /api/folders/{{folder_id}}, указав идентификатор папки. В JSON-ответе найдите preview_url в source_media. В preview_url содержится ссылка на видео. Из плагина получить MP4-видео нельзя (только в виде последовательности кадров).

  • При использовании архитектуры capture также необходимо добавить в запрос POST {{host}}/api/folders дополнительное поле additional_info. Оно нужно для сбора информации о среде клиента. Пример заполнения тела запроса:

"VIDEO_FILE_KEY": VIDEO_FILE_ZIP_BINARY
"payload": "{
        "media:meta_data": {
           "VIDEO_FILE_KEY": {
              "additional_info": <additional_info>
              }
           }
}"
  • Для передачи в Oz API используйте данные без кодирования в base64.

Files · main · oz-forensics / Oz Forensics Public projects / oz-liveness-ios-sample · GitLabGitLab

Журнал изменений

Журнал изменений API Core.

6.3.5 – 03.11.2025

  • Исправили ошибки, из-за которых по запросу GET /api/folders/ могли возвращаться некорректные результаты.

6.3.4 – 20.10.2025

  • Обновили API в рамках подготовки к внедрению новой функциональности.

  • Исправили ошибки.

6.3.3 – 29.09.2025

  • Исправили ошибку, из-за которой при отправке поврежденного видео с помощью методов POST /api/instant/folders/ и POST /api/folders/ система возвращала “500 Internal Server Error”. Теперь возвращается “400 Bad Request”.

  • Обновили API в рамках подготовки к внедрению новой функциональности.

6.3.0 – 05.08.2025

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

  • Вы можете убрать права администратора у пользователя с ролью CLIENT ADMIN, изменив его роль на CLIENT с помощью метода PATCH /api/users/{{user_id}}.

  • Теперь вы можете создать сервисный токен для пользователя с ролью OPERATOR.

  • Повысили безопасность.

6.2.5 – 18.06.25

  • Оптимизировали API и улучшили его производительность.

6.2.3 – 02.06.25

  • Анализы теперь могут выполняться параллельно друг другу. Для включения опции установите значение true параметру OZ_ANALYSE_PARALLELED_CHECK_MEDIA_ENABLED в файле config.py (значение по умолчанию – false).

  • Вы можете выключить авторизацию для Instant API (режима работы без сохранения данных). Добавьте в файл конфигурации config.py параметр OZ_AUTHORIZE_DISABLED_STATELESS и установите ему значение true (значение по умолчанию – false).

  • Исправили ошибку, из-за которой видео в MP4 могло не проигрываться после скачивания из SDK.

  • Для запросов без авторизации теперь возвращается корректная ошибка.

  • Исправили ошибку, из-за которой временами появлялась ошибка 500. Это происходило, если в видео было слишком мало кадров. Добавили соответствующую проверку и сделали описания ошибок более информативными.

  • Улучшили производительность, сделали удобнее процесс установки, повысили безопасность.

6.0.1 – 30.04.25

  • Оптимизировали хранилище и базу данных.

  • Добавили новый способ отправки данных на анализ: единый запрос. Этот запрос включает в себя создание папки и назначение анализов в одном и том же запросе – все необходимые данные указываются в payload.

  • Добавили новый режим работы API, при котором данные запроса и ответа не сохраняются ни локально, ни в какой-либо базе данных. Instant API может использоваться и сам по себе, и с другими компонентами API.

  • Теперь можно комбинировать рабочие системы, использующие асинхронные методы или Celery worker (локальная обработка, обработка через Celery). Для каждой из комбинаций добавлена поддержка хранения в S3.

  • Повысили безопасность.

  • Прекратили поддержку RAR-архивов.

  • Временно не поддерживаем Active Directory. В будущих релизах планируем вернуть эту функциональность.

  • Длительность анализа теперь считается точнее.

  • Для роли CLIENT заменили флаги is_admin и is_service новыми ролями: CLIENT ADMIN и CLIENT SERVICE соответственно. Для установки роли воспользуйтесь параметром user_type.

  • Чтобы выписать сервисный токен для пользователя с помощью метода {{host}}/api/authorize/service_token/, убедитесь, что этому пользователю назначена роль CLIENT SERVICE. Токен для другого пользователя с такой ролью можно создать с помощью {{host}}/api/authorize/service_token/{user_id}.

  • Убрали атрибуты коллекции и персоны из COLLECTION.analysis.

  • Мы больше не записываем кадры в SHOTS_SET как отдельные объекты. Для сохранения одного из кадров вашего видео вы можете воспользоваться опцией "Лучший кадр".

  • Больше не поддерживаем установку через Podman.

  • Обновили методы API: Oz API 6.0.

  • Заменили параметры и точки входа:

PATCH users/{{user_id}}/ для смены пароля

POST /api/users/{{user_id}}/change-password

DELETE images|media/<media_id> для удаления фото персоны из коллекции

DELETE collections/<collection_id>/persons/<person_id>/images/<media_id>/

image_id, video_id и shots_set_id

media_id

analyse_id

analysis_id

can_start_analyse_biometry

can_start_analysis_biometry

can_start_analyse_collection

can_start_analysis_collection

can_start_analyse_documents

can_start_analysis_documents

can_start_analyse_quality

can_start_analysis_quality

expire_date в {{host}}/api/authorize/auth и {{host}}/api/authorize/refresh

access_token.exp из payload

session_id в {{host}}/api/authorize/auth и {{host}}/api/authorize/refresh

token_id

5.3.1 – 24.12.2024

  • Оптимизировали потребление серверных ресурсов при проведении биометрического анализа.

5.3.0 – 21.11.2024

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

  • Подготовили новый шаблон отчета, который также соответствует этим требованиям.

  • Миниатюры для нового отчета генерируются на основе кадров с действиями.

5.2.0 – 06.09.2024

  • Обновили коллекцию Postman. Опубликовали новую коллекцию здесь и на https://apidoc.ozforensics.com/.

  • Добавили метод проверки настроек таймзоны: GET {{host}}/api/config

  • Добавили параметры к методу GET {{host}}/api/event_sessions:

    • time_created

    • time_created.min

    • time_created.max

    • time_updated

    • time_updated.min

    • time_updated.max

    • session_id

    • session_id.exclude

    • sorting

    • offset

    • limit

    • total_omit

  • При создании папки с SHOT_SET соответствующее видео будет в media.video_url.

  • Исправили ошибку, из-за которой CLIENT ADMIN не мог установить новый пароль для пользователя из своей компании.

5.1.1 – 16.07.2024

  • Обновления безопасности.

5.1.0 – 20.03.2024

  • Добавили возможность сравнения лица с большой базой фотографий, содержащей миллион фото и более, – Face Identification 1:N.

  • Анализ Liveness (QUALITY) теперь игнорирует фото с тегами photo_id, photo_id_front или photo_id_back.

5.0.1 – 16.07.2024

  • Обновления безопасности.

5.0.0 – 17.11.2023

  • Анализ Liveness (QUALITY) теперь работает и с изображениями.

  • Исправили ошибку, из-за которой анализ Liveness мог завершиться с успехом при отсутствии медиафайлов в папке (заявке).

  • Для extract_best_shot изменили значение по умолчанию на True.

  • Архивы RAR больше не поддерживаются.

  • По умолчанию в analyses.results_media.results_data теперь один параметр: confidence_spoofing. Если для обратной совместимости нужны все три (confidence_replay, confidence_liveness и confidence_spoofing), это можно настроить.

  • Обновили PDF-отчет, который грузится по умолчанию.

  • Название PDF-отчета теперь содержит folder_id.

4.0.8-patch1 – 16.07.2024

  • Обновления безопасности.

4.0.8 – 22.05.2023

  • Настроили авторотацию логов.

  • Добавили консольную команду для удаления пользователя.

  • Генерацию предпросмотра видео теперь можно отключить.

  • Токен доступа для роли ADMIN теперь действителен 5 лет.

  • Добавили идентификатор папки folder_id к названию отчета.

  • Исправили ошибки и оптимизировали работу API.

4.0.2 – 13.09.2022

  • Система теперь удаляет ненужные кадры, оставшиеся после раскадровки видео.

  • Добавили новые методы GET and POST для media/<media_id>/snapshot/

  • Заменили шаблон отчета по умолчанию.

  • Превью для набора кадров теперь показывается с исходным соотношением сторон.

  • ADMIN и OPERATOR автоматически добавляются в system_company.

  • Для User, Folder, Analyse, Media добавили атрибут company_id.

  • Для Analysis добавили атрибут group_id.

  • Для Folder и Analysis добавили атрибут system_resolution.

  • resolution_status теперь возвращает значение system_resolution.

  • Убрали метод PATCH для коллекций.

  • Добавили фильтр по resolution_status для Folder Analyses [LIST] и по analyse.resolution_status для Folder [LIST].

  • Для Folder, User, Company добавили журналирование.

  • Обновили алгоритм удаления компании.

  • Улучшили логику обработки черных списков.

  • Исправили несколько багов.

3.33.0

  • Модули Photo Expert и KYC удалены.

  • Обновили конечную точку для изменения пароля пользователя: POST users/user_id/change-password вместо PATCH.

3.32.1

  • Доступен лог для Celery.

3.32.0

  • Добавили в параметры запроса Folder [LIST] фильтры: analyse.time_created, analyse.results_data для анализа Documents, results_data для анализа Biometry, results_media_results_data для анализа QUALITY. Для включения фильтра установите True в параметре запроса with_results_media_filter.

3.31.0

  • Добавили новый атрибут для пользователей – is_active (по умолчанию True). Если выставлено False, пользователь не может совершать никакие действия.

  • Добавили новую ошибку, которая выводится в ответ на попытку заблокированного пользователя что-либо сделать.

3.30.0

  • Добавили превью наборов изображений.

  • Теперь наборы можно сохранять на диск через атрибуты original_local_path, original_url.

  • Добавили атрибут original_info для набора изображений – в нем хранятся сумма md5, размер, mime-тип.

  • Исправили отчет для наборов изображений.

3.29.0

  • Добавили “проверку здоровья” системы - метод GET api/healthcheck. Можно задать перечень имен / очередей задач на проверку активности.

3.28.1

  • Поправили ссылку на миниатюру для набора изображений.

3.28.0

  • Первое изображение в наборе теперь устанавливается как миниатюра для превью набора.

3.27.0

  • Поменяли политики – максимальное количество попыток анализа увеличили до 3 и ввели настраиваемую задержку.

  • Поменяли алгоритм вызова callbacks.

  • Переработали и описали инструменты командной строки.

  • Провели рефакторинг модулей.

3.25.0

  • Поменяли подметод и метод для удаления персональных данных – с delete_pi на /pi и с POST на DELETE соответственно.

3.23.1

  • Улучшили алгоритм удаления персональных данных.

  • В папки, которые были очищены, теперь нельзя добавлять медиа.

3.23.0

  • Поменяли название подметода авторизации с auth на auth_restore.

  • Добавили тег video_selfie_oneshot.

  • Добавили настройки валидации пароля.

  • Добавили задержки для auth, rest_unauthorized, rps_with_token (OZ_THROTTLING_RATES в настройках, по умолчанию отключено).

  • Теперь можно проверять доступы пользователя к статичным файлам (OZ_USE_PERMISSIONS_FOR_STATIC в настройках, по умолчанию – False).

  • Добавили новый подметод для заявки - /delete_pi. С его помощью можно удалить в заявке все персональные данные и связанные с ними анализы.

3.22.2

  • Добавили ошибку, которая появляется при попытке синхронизировать пустые коллекции.

3.22.0

  • Добавили параметр fields_to_check к анализу документов (по умолчанию проверяет все поля).

  • Добавили параметр double_page_spread к анализу документов (по умолчанию включен).

3.21.3

  • Поправили синхронизацию коллекций.

3.21.0

  • Теперь можно продлить токен авторизации с помощью expire_token.

3.20.1

  • Добавили поддержку application/x-gzip.

3.20.0

  • Переименовали shots_set.images в shots_set.frames.

3.18.0

  • Добавили набор функций по управлению сессиями пользователя.

  • Пользователи могут менять владельцев заявок (в соответствии со своими доступами).

  • Поменяли правила зависимостей.

  • Поправили баг с продлением авторизации.

3.16.0

  • Переместили функционал синхронизации коллекций в oz_core.

3.15.3

  • Упростили работу с наборами изображений. Один набор – один архив.

3.15.2

  • Улучшено распознавание документов для Dockered-версии.

3.15.1

  • Переместили проверку тега ориентации в анализ Quality.

3.15.0

  • Добавили шаблон отчета по умолчанию для ролей Admin и Operator.

3.14.0

  • Обновили биометрическую модель.

3.13.2

  • Исправили ошибку с созданием объекта набора изображений без изображений.

  • Добавили новый формат обмена данными для модуля распознавания документов.

3.13.1

  • Если для персон в коллекции проводились какие-либо анализы, коллекцию теперь нельзя удалить.

3.13.0

  • Добавили к анализам временные метки time_task_send_to_broker, time_task_received, time_task_finished.

3.12.0

  • Добавили новый механизм авторизации – соединение с Active Directory через LDAP.

3.11.0

  • Добавили новый тип медиа в заявку: "shots_set"

  • Персону в коллекции теперь нельзя удалить, если с ней производились какие-либо анализы.

3.10.

  • Переименовали поле заявки resolution_suggest в operator_status.

  • Добавили к заявке текстовое поле operator_comment.

  • Доступ на редактирование полей заявки operator_status и operator_comment есть у Admin, Operator, Client Service, Client Operator и Client Admin.

  • Доступ на удаление заявки, медиа из заявки, шаблонов отчетов и их вложений, самих отчетов и анализов теперь есть только у Admin и Client Admin (в рамках компании).

3.9.0:

  • Исправили удаление отчетов – теперь они удаляются при удалении их автора.

3.8.1

  • Поправили доступы – Client теперь может просматривать только свой профиль.

3.8.0

  • Client Operator теперь может редактировать только свой профиль.

  • Client больше не может удалять свои заявки, любые медиа, отчеты или анализы.

  • Client Service может создавать персон в коллекциях и просматривать отчеты в рамках компании.

3.7.1

  • У ролей Client, Client Admin, Client Operator теперь есть доступы на просмотр профилей пользователя только внутри компании.

  • Запустили альфа/бета-тестирование.

  • Теперь поддерживаем заголовок с датой просрочки токена авторизации.

  • Добавили поддержку модуля распознавания документов для стенделона и Docker.

3.7.0

  • Добавили роль Client Operator – это Client Admin, но без доступа к управлению аккаунтом и компанией.

  • И Client Admin, и Client Operator могут менять статус анализа.

  • Создавать, редактировать и удалять что-либо в моделях Collection и CollectionPerson в рамках компании теперь могут только Admin и Client Admin.

  • При создании отчета по заявке теперь проверяются доступы пользователя к шаблонам.

  • Поправили код статуса, который возвращается при создании коллекции, с 200 на 201.

Logo

Журнал изменений

Журнал изменений Web SDK.

1.8.1 – 09.10.2025

  • Web SDK больше не вылетает с ошибкой, когда вы вызываете метод OzLiveness.hide() сразу после запуска плагина.

  • Улучшили производительность.

  • Повысили безопасность.

1.8.0 – 26.09.2025

  • Web Plugin теперь можно запустить в оконном режиме. Установите нужное значение parent_container в OpenOptions: parent_container: string | HTMLElement.

  • Добавили возможность настройки переходов для loader. Соответствующие настройки приведены здесь.

  • SDK теперь лучше работает с жестами наклона и подъема головы.

  • Исправлена проблема с чрезмерным количеством сообщений об ошибках в консоли.

  • Обновили телеметрию.

  • Повысили безопасность.

1.7.15 – 12.08.2025

  • Вы можете настроить собственный loader вместо используемого по умолчанию. Соответствующие настройки приведены здесь.

  • Вы можете управлять поведением SDK, если получение доступа к камере занимает слишком много времени. Воспользуйтесь настройками get_user_media_promise_timeout_*, приведенными здесь.

  • Повысили безопасность и улучшили телеметрию.

1.7.14-89-1 – 09.07.2025

  • Критические изменения: мы больше не передаем в коллбэках значения оценок. confidence_spoofing нужно заменить на 0 для SUCCESS и на 1 для других статусов.

  • Исправили ошибку чтения свойств image_data_tensor.

  • Исправили ошибку, из-за которой OzLiveness иногда вызывался позже, чем нужно.

  • Обновление безопасности.

1.7.14 – 13.06.2025

  • Добавили поддержку API 6.0.

  • При настройке конфигурации сервера переменные в заголовках CORS теперь указываются без кавычек.

  • Добавили новый параметр auth , который указывает, используется ли авторизация, и если да, то каким способом:

    • true (по умолчанию) – включена авторизация на базе генерируемого ключа доступа;

    • user:pass – включена авторизация на базе логина и пароля;

    • false – авторизация выключена.

  • Настройки цвета для 3D-маски теперь работают корректно.

  • Зеркалирование при отключенном use_for_liveness теперь также работает корректно.

  • Поправили ошибку, из-за которой не выполнялось сканирование документа в плагине.

  • Улучшили работу озвучки SDK: экранные дикторы читают подсказки по мере прохождения проверок (доступ к камере, загрузка и обработка данных, запрос результата) правильнее и при переключении подсказок реагируют быстрее.

  • Добавили возможность проверки лицензии: [GET] /check_license.php.

  • Уменьшили размер загружаемых компонентов.

  • Результаты анализа в коллбэке on_complete при result_mode: full теперь передаются корректно.

  • Исправили ошибку, из-за которой кнопка переключения камеры могла не отображаться.

  • Передняя камера больше не отзеркаливает действия пользователя.

  • Улучшили обработку ошибок.

  • SDK теперь лучше работает на устройствах с низкой производительностью.

  • Добавили проверку на закрытые глаза для жеста Scan.

  • Исправили ошибки, повысили безопасность, обновили телеметрию и улучшили работу SDK в целом.

1.6.15 – 27.12.2024

  • Упрощены проверки, требующие от пользователя движения головы: актуально для жестов поворота головы влево или вправо, наклона головы вперед или назад.

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

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

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

  • Исправлена ошибка, из-за которой на экране съёмки после захвата жестов с движением головы неверно отображалась стрелка.

  • Исправлена ошибка, из-за которой на экране съёмки при отображении фразы "Отлично!" исчезал овал.

  • Улучшен поиск лучшего кадра.

  • Обновления безопасности.

1.6.12 – 18.10.2024

  • Обновления безопасности.

  • Исправили ошибку, из-за которой видео могло некорректно создаваться из последовательности кадров.

1.6.0 – 24.06.2024

  • Коллбэк-функция on_complete теперь вызывается после изменения общего статуса папки (заявки).

  • Обновили инструкции по доступу к камере для браузеров Android Chrome и Facebook. Новые ключи:

    • error_no_camera_access,

    • oz_tutorial_camera_android_chrome_with_screens_title,

    • oz_tutorial_camera_android_chrome_instruction_screen_click_settings,

    • oz_tutorial_camera_android_chrome_instruction_screen_permissions,

    • oz_tutorial_camera_android_chrome_instruction_screen_allow_access,

    • try_again,

    • oz_tutorial_camera_external_browser_button,

    • oz_tutorial_camera_external_browser_manual_open_link,

    • oz_tutorial_camera_external_browser_title.

  • Добавили метод get_langs() – с его помощью можно узнать, какие языковые пакеты установлены в Web SDK.

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

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

  • Обновили тексты ошибок error_connection_lost и error_service_unavailable.

  • Обновили языковые файлы для Web SDK.

  • Функция обрезки больше не добавляет полосы к кадрам c разрешением менее 512×512.

1.5.3 – 28.05.2024

  • Если доступ к камере отсутствует в течение длительного времени, пользователям теперь показывается инструкция, как его включить. Для всех браузеров, кроме Facebook, отображается инструкция по умолчанию, для Facebook – отдельная.

  • Добавили несколько записей в файл локализации Web SDK. Новые ключи локализации:

    • accessing_camera_switch_to_another_browser,

    • error_camera_timeout_instruction,

    • error_camera_timeout_title,

    • error_camera_timeout_android_facebook_instruction.

1.5.0 – 05.05.2024

  • Улучшили работу с картоматами: расстояние, на котором может распознаваться лицо пользователя, увеличено.

  • Добавили в Web Plugin параметр disable_adaptive_aspect_ratio. Этот параметр выключает подстройку соотношения сторон видео под окно съемки.

  • Добавили в Web Plugin параметр get_user_media_timeout: когда SDK не может получить доступ к камере, по истечении этого таймаута появится подсказка, как решить проблему.

  • Добавили несколько записей в файл локализации Web SDK. Новые ключи:

    • oz_tutorial_camera_android_edge_browser

    • oz_tutorial_camera_android_edge_instruction

    • oz_tutorial_camera_android_edge_title

    • error_camera_timeout_instruction

    • error_camera_timeout_title

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

  • Бессерверный Web SDK теперь можно распространять через Node Package Manager.

  • Демонстрацию ошибок API в модальном окне теперь можно отключить. Установите параметру disable_adapter_errors_on_screen значение True.

  • Мобильные браузеры теперь используют основную (заднюю) камеру для съемки документов.

  • Обновили образцы кода.

  • Исправили ошибку, когда при повторной попытке пользователя пройти сценарий после неудачи 3D-маска не реагировала на лицо.

  • Обновления безопасности и журналирования.

1.4.3 – 15.04.2024

  • Исправили ошибку, из-за которой при съемке лица в горизонтальной ориентации на мобильных устройствах не показывалось предупреждение о необходимости поворота устройства вертикально.

  • У некоторых пользователей ранее наблюдались зависания при использовании WebView. Теперь в этих случаях пользователь может нажать кнопку, чтобы продолжить работу с приложением. В связи с этим обновили файл со строками в разделе локализации. Ключ: tap_to_continue.

1.4.2 – 14.03.2024

  • Расширили возможности отладки.

1.4.1 – 27.02.2024

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

  • Улучшили поддержку WebView:

    • Добавили инструкции для неизвестных WebView-браузеров на платформах Android и iOS. Соответствующие события записываются при журналировании.

    • Улучшили интеграцию с React Native: добавили атрибут webkit-playsinline, чтобы запуск камеры в полноэкранном режиме для iOS WebView работал корректно.

  • Ошибка работы с iFrame при параметре iframe_allowed = False теперь отображается корректно.

  • Новые ключи локализации:

    • oz_tutorial_camera_android_webview_browser

    • oz_tutorial_camera_android_webview_instruction

    • oz_tutorial_camera_android_webview_title

1.4.0 – 07.02.2024

  • Web SDK теперь работает и с черным списком: вы можете сравнить лицо из снятого Liveness-медиафайла с лицами из вашей базы данных. Создайте коллекцию (или коллекции) с нужными фотографиями через API или веб-интерфейс и добавьте соответствующий идентификатор (или идентификаторы) в массив analyses.collection_ids в файле конфигурации веб-адаптера.

  • Мы вернули поддержку iframe: установите для параметра iframe_allowed в файле конфигурации Web Adapter значение True.

  • Интервал опроса для получения результатов анализов теперь можно настраивать. При необходимости измените его в параметре results_polling_interval файла конфигурации Web Adapter.

  • Теперь вы можете выбрать, какую камеру использовать, переднюю или заднюю, и через веб-плагин. В методе OzLiveness.open() установите для cameraFacingMode значение user для передней камеры и environment для задней. Этот параметр работает только в том случае, если для параметра use_for_liveness в файле конфигурации веб-адаптера не установлено значение.

  • Стили плагина теперь добавляются автоматически. Обратите внимание: удалите стили, которые вы ранее применили к странице клиента вручную (строка <link rel="stylesheet" href="/plugin/ozliveness.css" />), чтобы избежать конфликтов.

  • Исправлены некоторые ошибки и улучшено журналирование.

1.3.1 – 12.01.2024

  • Улучшили защиту против инъекционных атак.

  • Заменили идентификатор языка для бразильского португальского с pt на pt-br согласно стандарту ISO.

  • Удалили конфигурационный параметр lang_default.

  • Прозрачность 3D-маски теперь можно настраивать.

  • Добавили возможность использования мастер-лицензии, которая работает без ограничений по домену.

  • Добавили параметр master_license_signature в параметры конфигурации Web Adapter.

  • Исправили ошибки.

1.2.2 – 15.12.2024

  • Улучшили работу SDK.

1.2.1 – 04.11.2023

  • Добавили 3D-маску, которая заменяет овал при съемке видео нашим SDK. Для включения маски установите конфигурационному параметру load_3d_mask значение true.

  • Обновили телеметрию (журналирование).

1.1.5 – 27.10.2023

  • Обновления журналирования.

1.1.4 – 10.2023

  • Обновления безопасности.

1.1.3 – 29.09.2023

  • Улучшили работу SDK.

1.1.2 – 21.09.2023

  • Улучшили работу SDK.

1.1.1 – 29.08.2023

  • Исправили ошибки.

1.1.0 – 24.08.2023

  • Изменили сигнатуру коллбэка on_error(): теперь он возвращает не только код ошибки, но и сообщение, а также идентификатор телеметрии для журналирования.

  • Добавили параметр конфигурации для режима debug. Если он принимает значение True, в Web SDK можно открыть страницу /debug.php, на которой размещена информация о текущих конфигурации и лицензии.

  • Исправили несколько ошибок и улучшили журналирование.

1.0.2 – 06.07.2023

  • Добавили возможность выбора камеры при запуске плагина (если на устройстве их несколько).

1.0.1 – 01.07.2023

  • Полностью переделали дизайн для SDK и демо, в том числе добавили настройки защиты от мошенников: при включении опции во время записи видео появляется дополнительное сообщение. Новые возможности настройки интерфейса описаны здесь.

  • Перевели SDK на португальский, испанский и казахский языки.

  • Добавили жест Комбо.

  • Добавили шкалу прогресса для загрузки медиа.

  • Жесты Zoom in и Zoom out больше не поддерживаются.

  • Съемка видео в альбомной ориентации теперь работает корректно для планшетов.

  • Убрали опцию lang_allow из файла конфигурации Web Adapter.

0.9.1 – 01.03.2023

  • В архитектуре capture при обнаружении виртуальной камеры параметр additional_info теперь отображается внутри списка from_virtual_camera.

  • Добавили возможность обрезать кадр с лицом без потери качества.

  • Координаты "ориентиров" лица для архитектуры capture теперь передаются корректно.

0.9.0 – 20.02.2023

  • Улучшили качество съемки;

  • Значительно переработали лицензирование:

    • добавили описание ошибок, теперь понятно, что и почему произошло;

    • теперь можно указывать лицензию в JS в процессе работы;

    • при применении в OzLiveness.open() лицензия переписывает предыдущую;

    • лицензия теперь не требует указания порта и протокола;

    • в URL лицензии можно указывать поддомены;

    • информация о лицензии выводится в лог Docker при запуске плагина на сервере;

    • при использовании на localhost и 127.0.01 лицензия больше не запрашивается;

  • Коллбэк on_capture_complete вызывается на всех архитектурах по завершении съемки видео и содержит информацию о жестах на этом видео;

  • При запуске Oz Web Liveness и Oz Web Adapter их версии теперь выводятся в лог Docker;

  • Добавили параметры для передачи при съемке информации о прямоугольнике, в который вписано лицо;

  • Убрали неиспользуемое поле adapter_version из метаданных заявки;

  • Починили кнопку переключения камер в Google Chrome;

  • При старте Web SDK в лог Docker выводятся фактические параметры конфигурации.

0.7.6 – 27.09.2022

  • Изменили расширение некоторых файлов системы Oz Forensics с .bin на .dat.

0.7.5

  • Ссылки на дополнительные скрипты теперь формируются с использованием адреса основного скрипта.

0.7.4

  • Добавили возможность распространять Web SDK только статическими файлами, без адаптера (в режиме capture).

  • Web SDK теперь может работать с CDN.

  • Теперь можно запускать несколько экземпляров Oz Liveness Web Plugin на разных страницах, в этом случае необходимо указать на этих страницах путь для загрузки скриптов.

При обновлении с 0.4.0 лицензию необходимо также обновить.

0.4.1

  • Исправили ошибку экрана съемки.

0.4.0

  • Добавили лицензирование, для получения лицензии необходим origin.

  • Внешний вид Web SDK теперь можно настраивать.

0.3.2044

  • Исправили ошибки интеграции с Angular.

0.3.2043

  • Исправили ошибку с отсутствием секции IMAGE_FOLDER в JSON-ответе при включенном lossless-кадре.

0.3.2042

  • Исправили ошибки работы с библиотекой ravenjs.

0.3.2041

  • Рамку для фото документов теперь можно настроить.

0.3.2012

  • Повысили безопасность SDK.

0.3.2009 (0.4.8)

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

0.3.2005 (0.4.8)

  • В формате видео / режиме zip теперь можно загружать lossless-кадр.