Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 135 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

База знаний Oz

Общая информация

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...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Oz API и Oz API Lite

Облегченное решение для биометрической идентификации личности по лицу и подтверждения подлинности присутствия с помощью Liveness.

Liveness и сравнение лиц также могут производиться с помощью модуля Oz API Lite. Этот модуль принципиально отличается от Oz API.

  • Никакие данные нигде не сохраняются,

  • Очень просто масштабировать горизонтально,

  • Отсутствует аутентификация и нельзя управлять доступом,

  • Работает только с изображениями.

Oz API Lite рекомендуется использовать для встраивания в ваш продукт при высоких требованиях к производительности (миллионы проверок в неделю).

Гибридный Liveness

В версиях SDK для Android и iOS 8.0.0 мы добавили новый режим анализа – гибридный. Это комбинация анализов на устройстве и на сервере, сочетающая в себе плюсы обоих подходов. Если анализ на устройстве дает неоднозначный результат по поводу присутствия живого человека в кадре, система запускает анализ на сервере, в ином случае никаких дополнительных проверок не проводится.

Преимущества гибридного анализа

Требования к вычислительной мощности ниже: в большинстве случаев анализа на устройстве достаточно, так что проверки на сервере не нужны, количество запросов также сокращается. На Android перепроверка требуется 8-9% анализов, на iOS – 4,5-5,5%.

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

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

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

Как включить гибридный режим анализа

Для запуска гибридного анализа нужна версия наших мобильных SDK 8.0.0 или выше. При этом серверный анализ будет запускаться в меньшинстве случаев, поскольку однозначный результат анализа на устройстве означает ненужность «второго мнения» от сервера – соответственно, ресурсов сервера потребуется меньше.

Пассивный и активный Liveness

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

В наших мобильных SDK, а также в Web SDK вы можете установить, что именно должен сделать пользователь перед камерой. Можно также объединить несколько действий в последовательность. Действия различаются по:

  • сложности для пользователя,

  • размеру итогового файла,

  • точности проверки Liveness,

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

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

Пассивный Liveness

Selfie (простое селфи)

Короткое видео длительностью около 0,7 секунды.

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

One shot (один кадр)

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

Рекомендуется, если самый важный фактор – размер итогового файла.

Человеку (оператору или судье) может быть затруднительно оценить результаты.

Scan (сканирование)

5-секундное видео, для которого пользователя просят проследить глазами за двигающимся текстом.

Рекомендуется в случаях, когда наиболее вероятны последующие проверки со стороны человека и требуется более длинное видео для оценки.

Активный Liveness

  • Улыбка

  • Моргание

  • Поднять голову

  • Опустить голову

  • Повернуть голову налево

  • Повернуть голову направо

Пользователю нужно сделать определенный жест в течение 5 секунд.

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

Архитектура Oz

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

Oz API

Oz API – центральный компонент системы, RESTful API-интерфейс для доступа к основной функциональности анализов Liveness и Face Matching. Преимущества Oz API:

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

  • Возможность работать и с фото, и с видео.

  • Асинхронность анализов.

  • Безопасная аутентификация.

  • Гибкая настройка уровней доступа.

«Под капотом» Oz API работают следующие компоненты:

  • Хранилище файлов и база данных, где сохраняется информация о медиафайлах, анализах и так далее,

  • Модуль Oz BIO – он отвечает за работу специально обученных нейронных сетей, распознающих лица,

  • Логика лицензирования.

Фронтенд-компоненты, такие как мобильные или Web SDK, подключаются к Oz API в процессе обработки серверных анализов. Они могут это делать и напрямую, и через бэкенд клиента.

iOS и Android SDK

iOS и Android SDK вместе называются мобильными (или нативными) SDK. Первый написан на SWIFT, второй – на Kotlin/Java. Оба они созданы для интеграции в ваши мобильные приложения.

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

После записи Liveness-видео вы можете запустить анализы или на сервере, или на устройстве.

Web SDK

Web SDK состоит из Web Adapter и Web Plugin. Web SDK также разработан для интеграции в ваше приложение – в его веб-версию. Функциональность Web SDK аналогична таковой для iOS и Android: удобный для пользователей процесс съемки видео в оптимальном для последующих анализов качестве.

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

  1. Обнаружение атак путем сбора информации о контексте браузера и свойствах камеры – таким образом можно засечь виртуальную камеру или другие инструменты инъекционных атак.

  2. Запись видео в формате, в котором запущенные на сервере нейронные сети могут наиболее эффективно отследить атаку в уже записанном видео.

Web UI (веб-консоль)

Описание системы Oz Forensics

Общая документация по работе с системой «Oz Forensics»

Oz Forensics специализируется на проверках Liveness и Face Matching (сравнении лиц): мы разрабатываем продукты, которые помогают вам удаленно идентифицировать ваших клиентов и защищаться от любых видов спуфинга – презентационных и инъекционных атак, в том числе 3D-масок, дипфейков, атак вида MITM. Вы можете добавить в свое программное обеспечение Liveness, Face Matching или и то, и другое в зависимости от того, какие именно проверки вам нужны и в каком объеме. Мы постоянно совершенствуем наши компоненты, повышая их качество и надежность их работы.

Oz Liveness

  • Oz Liveness распознает лицо живого человека в полученном медиафайле. Алгоритм отличает реального человека в сознании от спящего, маски, фотографии, видеоролика с изображением лица и других видов спуфинг-атак. Поддерживаются мобильные и десктопные устройства. Алгоритм сертифицирован по стандарту ISO-30137-3 и прошел тест iBeta лаборатории NIST со 100% точностью.

Наша технология Liveness защищает и от инъекционных, и от презентационных атак.

Обнаружение инъекционных атак происходит в два этапа. Сперва наш SDK проверяет среду пользователя: нет ли манипуляций с браузером, камерой, и так далее. Затем готовый медиафайл анализируют нейронные сети, обеспечивая надежную защиту даже от самых сложных инъекционных атак.

Вероятность наличия презентационной атаки мы проверяем с помощью нейронных сетей различных архитектур, используя при этом собственные алгоритмы ансамблирования для оптимальной продуктивности. На результат работы сетей влияет множество факторов: свет, отражение, четкость картинки, фон, паттерны движения и другие. Наш Liveness работает как с пассивными (без жестов), так и с активными (различные жесты) проверками – чтобы вашим клиентам было удобно эти проверки проходить, а вы при этом получали достоверные результаты. Тест iBeta проводился на пассивном Liveness, и с тех пор мы значительно улучшили качество наших проверок.

Oz Face Matching (Biometry)

  • Oz Face Matching (Biometry) проводит биометрическую идентификацию человека, проверяя, принадлежит ли документ человеку, проходящему проверку, на основе биометрического сходства лиц. Модуль находит лучший кадр в снятом видео и сравнивает его с фотографией из документов. Точность в 99,99% подтверждена NIST FRVT.

Наши технологии основаны на алгоритмах машинного обучения. Мы поддерживаем и верификацию (1:1, Face Verification), и идентификацию лица (1:N, Face Identification). Для обучения нейронных сетей мы используем собственный фреймворк, построенный на новейших технологиях. Собственная база данных содержит более 4,5 миллионов уникальных лиц. В ней представлены различные этнические группы, кроме того, мы учитываем предполагаемые расу, возраст и т.д. Все это помогает нашим биометрическим моделям обеспечивать достоверные результаты сопоставления.

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

Программное обеспечение Oz сочетает точность анализа с легкостью интеграции и использования. Чтобы дополнительно упростить процесс интеграции, мы предоставили подробное описание всех ключевых концепций нашей системы в этом разделе. Если вы готовы начать, обратитесь к нашим руководствам по интеграции: мы подготовили пошаговые инструкции, которые помогут вам легко и быстро встроить проверки Liveness и Face Matching в ваше ПО.

Детальную информацию о модуле можно найти .

На Android установите HYBRID в Mode. На iOS : hybrid в mode. Проще простого.

Если у вас остались вопросы, .

Чтобы определить наличие тех или иных действий из списка для активного и пассивного Liveness, наши алгоритмы полагаются на теги. Эти теги соответствуют действиям, производимым пользователем во время записи видео. Узнать о тегах больше вы можете . Таблица соответствия действий (или, другими словами, жестов) для различных компонентов Oz Liveness находится .

Самые распространенные сценарии интеграции описаны в разделе .

Дополнительную информацию вы можете найти в статьях и . Проверить, как работает Oz API, можно с помощью нашей .

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

Анализ на устройстве (Liveness и Face matching) не требует взаимодействия с Oz API и даже подключения к интернету, он выполняется прямо на телефоне. Такой анализ применим при высоких требованиях к конфиденциальности, когда вы не хотите, чтобы какая-либо информация «ушла» с телефонов пользователей. Как работает такой анализ, описано .

Базовые сценарии интеграции Web SDK описаны , а в вы можете ознакомиться с руководством разработчика.

Web UI – веб-консоль для удобного просмотра хранящихся в API данных. Сама по себе она никакую информацию не записывает, а только предоставляет графический интерфейс для легкого взаимодействия с базой. Описание работы с интерфейсом Web UI вы найдете .

здесь
при запуске анализа
аналогично
будем рады на них ответить
здесь
здесь
Краткие руководства по интеграции
здесь
здесь
здесь
этом разделе
здесь

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

В этом разделе собраны описания наиболее часто встречающихся примеров интеграции системы Oz Forensics Liveness and Face Biometry. Сценарии могут как использоваться по отдельности, так и комбинироваться – например, интеграция Liveness сразу и в мобильное, и в веб-приложение или интеграция и Liveness-решения, и решения для сравнения лиц.

Проверки Liveness, Face Matching, Black List

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

  • Liveness проверяет наличие живого человека на фото или видео.

  • Face Matching сравнивает два или более медиафайла, определяя уровень сходства между запечатленными на фото или видео людьми.

  • Black list ищет сходства между лицом человека, запечатленного на фото или видео, и лицами в заранее созданной базе фотографий.

Liveness

Проверка Liveness используется для защиты от двух видов атак.

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

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

Oz Liveness распознает оба типа атак:

  • презентационные атаки – с помощью любых компонентов,

  • инъекционные атаки – с помощью Oz Liveness SDK.

Подробная информация о том, как противостоять описанным атакам, содержится в наших руководствах по интеграции:

По завершении проверки Liveness вы можете оценить качественные и количественные результаты.

Описание результатов

Качественные результаты

  • SUCCESS – анализ успешно завершен, проблем не обнаружено,

  • DECLINED – проверка не пройдена (выявлена атака).

Если анализ еще не завершен, результат может быть PROCESSING (идет процесс обработки) или FAILED (завершить анализ не удалось, возникли ошибки).

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

Количественные результаты

  • 100% (1) – обнаружена атака, человек на фото или видео не является реальным живым человеком.

  • 0% (0) – все в порядке, на фото или видео реальный живой человек.

Также при проверке Liveness может сохраняться best shot (лучший кадр) – это наиболее качественный кадр из всего видео, изображение, на котором лучше всего видно лицо.

Face Matching (сравнение лиц)

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

Описание результатов

Качественные результаты

  • SUCCESS – анализ успешно завершен, проблем не обнаружено,

  • DECLINED – проверка не пройдена (лица принадлежат разным людям).

Если анализ еще не завершен, результат может быть PROCESSING (идет процесс обработки) или FAILED (завершить анализ не удалось, возникли ошибки).

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

Количественные результаты

По завершении анализа система выводит оценки, которые отражают степень сходства между людьми, запечатленными на медиафайлах – от 100 до 0%.

  • 100% (1) – лица полностью одинаковые, на проверенных медиафайлах один и тот же человек.

  • 0% (0) – лица принадлежат разным людям.

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

Black list (черный список)

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

Описание результатов

Качественные результаты

  • SUCCESS – анализ успешно завершен, проблем не обнаружено,

  • DECLINED – проверка не пройдена (лица принадлежат разным людям).

Если анализ еще не завершен, результат может быть PROCESSING (идет процесс обработки) или FAILED (завершить анализ не удалось, возникли ошибки).

Количественные результаты

Результат проверки – число, которое показывает уровень сходства между лицом с только что снятого фото или видео и лицами из черного списка (от 100 до 0%).

  • 100% (1) – человек с только что снятого фото или видео найден в черном списке.

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

Модели использования: SaaS, локальная установка и анализ на устройстве

Мы предлагаем различные модели использования компонентов Oz – в зависимости от ваших надобностей и предпочтений. Вы можете подключиться к одному из наших облаков и работать с SaaS или интегрировать наши компоненты в свою инфраструктуру – система функционирует одинаково, какую бы модель взаимодействия с ней вы ни предпочли. Здесь мы приводим несколько советов по выбору.

Когда лучше выбрать SaaS

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

  • Быстрый старт. Вам не нужно приобретать оборудование или выделять ресурсы для системы.

  • Нулевые затраты на инфраструктуру. Мы обеспечиваем все необходимые серверные компоненты.

  • Низкая стоимость обслуживания. Свое оборудование мы обслуживаем и обновляем сами.

  • Данные не отправляются за границу вашей страны. Это актуально для регионов расположения наших облаков.

Когда лучше выбрать локальную установку на ваш сервер

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

  • Полный контроль над конфигурацией,

  • Хранение и обработку данных внутри вашей инфраструктуры – «наружу» информация не передается.

Когда лучше выбрать анализ на устройстве

Анализом на устройстве вы можете воспользоваться в наших мобильных SDK для анализов Liveness и Face Matching. Применим такой анализ, например, в следующих случаях:

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

  • Вы планируете использовать наши продукты в регионах с плохим покрытием интернет-сетями.

Какую модель выбрать, решаете только вы. Мы всегда готовы оказать помощь как в выборе, так и в сопровождении.

Ключевые понятия Oz API

Oz API обеспечивает полноценный REST API-интерфейс для биометрии лица: как сравнения лиц, так и Liveness-проверок. В этой статье описаны основные концепции Oz API.

Аутентификация, роли пользователей и управление доступом

Сохранение данных

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

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

Oz API работает и с фото-, и с видеофайлами. Видео при этом может быть как файлом в «обычном» понимании, то есть контейнером в формате MP4 или MOV, так и последовательностью кадров в ZIP-архиве. Чтобы определить тип медиафайла, Oz API использует MIME-тип файла.

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

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

  • photo_selfie – для референтного фото, не являющегося документом

  • video_selfie_blank – для Liveness-видео, снятого не средствами Oz Liveness SDK

  • если фото или видео снято средствами нашего SDK, теги выставляются автоматически

Асинхронные анализы

Варианты лицензирования

Для коммерческого использования нашего продукта необходима лицензия. Она определяет, какими функциями нашего ПО вы можете пользоваться – в соответствии с условиями договора. Лицензия выдается на ограниченное время и по необходимости продлевается.

Когда вы запускаете наши SDK или пользуетесь Oz BIO, система проверяет валидность лицензии. Это происходит в фоновом режиме и практически не влияет на взаимодействие пользователя с нашим продуктом.

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

  • Мобильные SDK для iOS и Android,

  • Web SDK (адаптер и плагин),

  • Oz BIO, который используется для серверных анализов при локальной установке.

Таким образом, если вы используете все три компонента нашего ПО, у вас будут три лицензии, каждая из которых будет привязана к своему компоненту.

Мобильные SDK (iOS и Android)

Для выпуска лицензии на мобильные (нативные) SDK нам потребуется bundle (application) ID вашего приложения. Лицензия бывает двух видов: онлайн и офлайн. Любой из этих типов работает с любым режимом анализа: на устройстве, на сервере или гибридным.

Онлайн-лицензия

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

  • Счетчик транзакций увеличивается на 1 при каждом запуске съемки видео для анализа.

  • Счетчик устройств увеличивается на 1 при каждой установке нашего SDK на новое устройство.

При запуске SDK обращается к серверу лицензий и получает от него список параметров, в том числе показания счетчиков транзакций и устройств.

Основные преимущества онлайн-лицензии:

  • Не нужно перевыпускать приложение после обновления лицензии,

  • Не нужно перевыпускать приложение, если вы хотите добавить в лицензию новый bundle (application) ID. Все делается на лету.

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

Обратите внимание: анализы на устройстве не требуют подключения к интернету, но оно все равно понадобится для проверки онлайн-лицензии.

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

Офлайн-лицензия

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

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

Как добавить лицензию в SDK:

Web SDK

Лицензия для Web SDK аналогична офлайн-лицензии для iOS и Android. Она работает и без интернета, все параметры прописаны в самом файле лицензии, нет ограничений по транзакциям или устройствам.

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

Локальная установка (Oz BIO, серверная лицензия)

Пробная лицензия

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

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

Проверка Liveness на сервере

В этом разделе собраны инструкции по интеграции серверных проверок Liveness.

Как провести проверку медиафайла на Liveness без использования фронтенда Oz

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

Ключевые преимущества Oz API:

  • Сохранение данных – ваши медиафайлы и анализы хранятся для будущего использования, пока вы самостоятельно их не удалите

  • Возможность работать и с фото, и с видео

  • Асинхронность анализов

  • Безопасная аутентификация

  • Гибкая настройка уровней доступа

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

Здесь мы приводим пошаговую инструкцию по проведению проверки Liveness для фото или видео лица, которое вы уже сняли с помощью бэкенда Oz.

  • Создание папки

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

  • Проверка Liveness

  • Получение результатов

Для вашего удобства и повышения точности анализов мы рекомендуем использовать для съемки медиа наши Web или Mobile SDK. Как это сделать, описано здесь:

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

Логин: ivan_ivanov@yourcompany.com

Пароль: …

API: https://sandbox.ohio.ozforensics.com

Web Console: https://sandbox.ohio.ozforensics.com

1. Получите токен доступа

В ответе вам придет токен доступа. В дальнейшем его нужно будет указывать в поле X-Forensic-Access-Token.

2. Поместите отдельные фотографии в архивы (для версии 4.0.8 и ниже)

Внимание: если вы используете API версии 5.0.0 или новее, пропустите этот шаг.

3. Загрузите медиафайлы в папку

В поле payload укажите следующие теги:

В случае успеха вернется код 201. В ответе будет идентификатор папки folder_id – он понадобится в дальнейшем.

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

Метод вернет analyse_id, который потребуется на следующем шаге.

5. Запустите опрос для получения результатов

  • качественные – в resolution (SUCCESS или DECLINED).

  • количественные – в results_media[0].results_data.confidence_spoofing. confidence_spoofing; они варьируются от 0.0 до 1.0, где 0.0 означает, что на фото или видео реальный человек, а 1.0 – что система обнаружила спуфинг-атаку.

Коллекция Postman для описанных в статье шагов:

Как интегрировать серверную проверку Liveness в ваше мобильное приложение

Из этой статьи вы узнаете, как интегрировать Oz Liveness Mobile SDK в клиентское мобильное приложение: для съемки видео с лицом и дальнейшей его проверки на сервере.

Oz Liveness Mobile SDK – это:

  • Готовый интерфейс для съемки видео, который легко встроить в приложение клиента.

  • Высокое качество видео, которое обеспечивает точность проверки Liveness.

«Под капотом» Oz SDK взаимодействует с OZ API.

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

Логин: ivan.ivanov@yourcompany.com

Пароль: …

API: https://sandbox.ohio.ozforensics.com

Web-консоль: https://sandbox.ohio.ozforensics.com

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

Android

1. Добавьте SDK в проект

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

В build.gradle модуля добавьте строки:

2. Инициализируйте SDK

Переименуйте файл лицензии в forensics.license и поместите его в папку res/raw в вашем проекте.

3. Подключите SDK к Oz API

Вам потребуются полученные от нас логин, пароль и адрес API-сервера.

4. Add face recording

Для начала съемки используйте метод startActivityForResult:

Для получения готового видео используйте onActivityResult:

Готовые видео содержатся в объекте sdkMediaResult.

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

Для запуска анализов используйте код ниже. mediaList – массив объектов, полученных из sdkMediaResult или извне (если вы снимали видео без использования нашего SDK).

iOS

1. Добавьте SDK в проект

2. Инициализируйте SDK

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

3. Подключите SDK к Oz API

Вам потребуются полученные от нас логин, пароль и адрес API-сервера.

4. Запустите съемку видео

Создайте контроллер, который будет снимать видео:

В делегате используйте протокол OZLivenessDelegate:

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

Для запуска анализов используйте AnalysisRequestBuilder. Метод run «под капотом» обратится к Oz API.

В руководстве разработчика вы также найдете инструкции по настройке внешнего вида SDK и список методов SDK как для iOS, так и для Android:

Ключевые понятия Oz API
Руководство разработчика: Oz API

Эти анализы доступны в Oz API как для модели SaaS, так и для локальной установки наших продуктов. Liveness и Face Matching также работают в режиме «на устройстве». Детальная информация по моделям использования находится .

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

Узнать о том, как внедрить технологию Face Matching в ваши процессы, вы можете в наших .

Больше об типах анализов и о том, что они проверяют, вы можете прочитать .

Минимальные требования к оборудованию

Сервер для Oz Biometry / Liveness

  • OS: требования к ОС указаны в

  • CPU: 16 ядер

  • RAM: 24 GB

  • На диске: 80 GB

Сервер для Oz API / Web UI / Web SDK

  • OS: требования к ОС указаны в

  • CPU: 8 ядер

  • RAM: 16 GB

  • На диске: 300 GB

В целях безопасности каждый вызов Oz API требует наличия в заголовке токена доступа. Чтобы получить этот токен, вызовите метод POST /api/authorize/auth с полученными от нас логином и паролем. В ответе вы получите токен доступа. Его нужно будет указывать в заголовке X-Forensics-Access-Token во всех последующих вызовах методов Oz API. Подробнее процесс аутентификации описан .

Для пользователей системы есть набор ролей, различающихся по предоставляемым возможностям: от роли CLIENT, которая дает возможность проводить проверки и скачивать отчеты без прав администратора, до ADMIN с полным доступом практически ко всем объектам системы. Детальная информация по ролям находится .

Поскольку анализ видео может занять несколько секунд, анализы проводятся асинхронно. Сначала вы запускаете анализ (POST /api/folders/{{folder_id}}/analyses/), а затем следите за результатами, периодически запрашивая их с сервера, пока обработка не закончится (GET /api/analyses/{{analyse_id}} для определенного анализа или GET /api/folders/{{folder_id}}/analyses/ для всех анализов, назначенных на папку). Кроме того, можно использовать вебхуки. С примером опроса и использования вебхука можно ознакомиться .

Более детальная информация о возможностях Oz API содержится в .

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

Для локальных установок мы выпускаем отдельную лицензию с ограничением по количеству активаций, где каждая активация соответствует отдельному экземпляру установки Oz BIO. Такая лицензия может работать и онлайн, и офлайн: это зависит от того, подключены ли к интернету соответствующие сервера. При онлайн-лицензировании SDK подключается к серверу лицензий для проверки, при офлайн потребуется. Мы поможем при установке сервера и активации лицензии.

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

Со всеми методами Oz API можно ознакомиться здесь: .

Мы рекомендуем использовать токен доступа вместо логина и пароля, так как это более безопасно. Вызовите POST /api/authorize/auth. В теле запроса укажите логин и пароль

В версии 4.0.8 и ниже проверка Oz Liveness может производиться либо по видео, либо по последовательности кадров в архиве. Таким образом, если вы хотите запустить проверку по одной фотографии, ее необходимо добавить в ZIP-архив. Oz API будет обрабатывать этот архив так же, как видео. Обратите внимание: теги к этому архиву необходимо указывать из .

Чтобы создать папку и добавить в нее ваши фото и видео, вызовите POST /api/folders/ и добавьте медиафайлы в тело запроса.

Для запуска анализа вызовите POST /api/folders/{{folder_id}}/analyses/ и укажите в нем folder_id из предыдущего шага. В теле запроса укажите анализ Liveness (Quality).

Раз в секунду отправляйте GET /api/analyses/{{analyse_id}} с полученным ранее analyse_id, пока состояние анализа не изменится с PROCESSING на какое-либо другое. Когда анализ завершится, вы сможете оценить результаты:

Шаги выше помогут вам выполнить Liveness-проверку через Oz API. Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь или API-запросами.

Детальную информацию о том, как применять инструменты Oz API, вы можете найти в .

Для работы Oz Liveness Mobile SDK нужна лицензия, которая привязывается к bundle_id приложения, например com.yourcompany.yourapp. Тестовую лицензию на месяц вы можете оформить самостоятельно , если вам требуется лицензия на более длительный срок – .

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

Установите OZLivenessSDK через . Чтобы встроить SDK в проект Xcode, в Podfile добавьте:

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

Шаги выше помогут вам в базовой интеграции наших мобильных SDK в ваше приложение. Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь или API-запросами.

здесь
Как интегрировать серверную проверку Liveness в ваше Web-приложение
Как интегрировать серверную проверку Liveness в ваше мобильное приложение
Как провести проверку медиафайла на Liveness без использования фронтенда Oz
Пассивный и активный Liveness
руководствах по интеграции
здесь
таблице совместимости
таблице совместимости
здесь
здесь
здесь
соответствующей секции нашего руководства разработчика
Android
iOS
установить офлайн-сервер лицензий
ссылке
свяжитесь с нами
{
    "credentials": {
        "email": "<login>", // электронная почта для доступа администратора
        "password": "<password>" // полученный от нас пароль
     }
}
{
    "media:tags": {
        "video1": [
            "video_selfie",
            "video_selfie_blank",
            "orientation_portrait"
        ],
    }
}
{
    "analyses": [
        {
            "type": "quality"
        }
    ]
}
allprojects {
    repositories {
        maven { url "https://ozforensics.jfrog.io/artifactory/main" }
    }
}
dependencies {
    implementation 'com.ozforensics.liveness:full:<version>'
    // номер версии можно найти в журнале изменений для Android
}
OzLivenessSDK.init(
    context,
    listOf(LicenseSource.LicenseAssetId(R.raw.forensics))
)
OzLivenessSDK.INSTANCE.init(
        context,
        Collections.singletonList(new LicenseSource.LicenseAssetId(R.raw.forensics)),
        null
);
OzLivenessSDK.setApiConnection(
    OzConnection.fromCredentials(host, username, password),
    statusListener(
        { token -> /* token */ },
        { ex -> /* error */ }
    )
)
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) { /* token */ }
            @Override
            public void onError(@NonNull OzException e) { /* error */ }
        }
);
OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(host, token))
OzLivenessSDK.INSTANCE.setApiConnection(
        OzConnection.Companion.fromServiceToken(host, token), 
        null
);
val OZ_LIVENESS_REQUEST_CODE = 1
val intent = OzLivenessSDK.createStartIntent(listOf( OzAction.Blank)) startActivityForResult(intent, OZ_LIVENESS_REQUEST_CODE)
int OZ_LIVENESS_REQUEST_CODE = 1;
Intent intent = OzLivenessSDK.INSTANCE.createStartIntent(Collections.singletonList(OzAction.Blank));
startActivityForResult(intent, OZ_LIVENESS_REQUEST_CODE);
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == OZ_LIVENESS_REQUEST_CODE) {
            val sdkMediaResult = OzLivenessSDK.getResultFromIntent(data)
            val sdkErrorString = OzLivenessSDK.getErrorFromIntent(data)
            if (!sdkMediaResult.isNullOrEmpty()) {
                analyzeMedia(sdkMediaResult)
            } else println(sdkErrorString)
        }
    }
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == OZ_LIVENESS_REQUEST_CODE) {
        List<OzAbstractMedia> sdkMediaResult = OzLivenessSDK.INSTANCE.getResultFromIntent(data);
        String sdkErrorString = OzLivenessSDK.INSTANCE.getErrorFromIntent(data);
        if (sdkMediaResult != null && !sdkMediaResult.isEmpty()) {
            analyzeMedia(sdkMediaResult);
        } else System.out.println(sdkErrorString);
    }
}
private fun analyzeMedia(mediaList: List<OzAbstractMedia>) {
    AnalysisRequest.Builder()
        .addAnalysis(Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaList))
        .build()
        .run(object : AnalysisRequest.AnalysisListener {
            override fun onSuccess(result: List<OzAnalysisResult>) {
                result.forEach { 
                    println(it.resolution.name)
                    println(it.folderId)
                }
            }
            override fun onError(error: OzException) {
                error.printStackTrace()
            }
        })
} 
private void analyzeMedia(List<OzAbstractMedia> mediaList) {
    new AnalysisRequest.Builder()
            .addAnalysis(new Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaList, Collections.emptyMap()))
            .build()
            .run(new AnalysisRequest.AnalysisListener() {
                @Override public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) {}
                @Override
                public void onSuccess(@NonNull List<OzAnalysisResult> list) {
                    for (OzAnalysisResult result: list) {
                        System.out.println(result.getResolution().name());
                        System.out.println(result.getFolderId());
                    }
                }
                @Override
                public void onError(@NonNull OzException e) { e.printStackTrace(); }
    });
}
pod 'OZLivenessSDK', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios', :tag => '<version>' // You can find the version needed in  iOS changelog
OZSDK(licenseSources: [.licenseFileName("forensics.license")]) { licenseData, error in
    if let error = error {
        print(error.errorDescription)
    }
}
OZSDK.setApiConnection(Connection.fromCredentials(host: “https://sandbox.ohio.ozforensics.com”, login: login, password: p)) { (token, error) in
    // Your code to handle error or token
}
OZSDK.setApiConnection(Connection.fromServiceToken(host: "https://api.sandbox.ozforensics.com", token: token)) { (token, error) in
}
let actions: [OZVerificationMovement] = [.selfie]
let ozLivenessVC: UIViewController = OZSDK.createVerificationVCWithDelegate(delegate, actions: actions) 
self.present(ozLivenessVC, animated: true)
let actions: [OZVerificationMovement] = [.selfie]
let ozLivenessVC: UIViewController = OZSDK.createVerificationVCWithDelegate(delegate, actions: actions) 
self.present(ozLivenessVC, animated: true)
let analysisRequest = AnalysisRequestBuilder()
let analysis = Analysis.init(
media: mediaToAnalyze, 
type: .quality, 
mode: .serverBased)
analysisRequest.uploadMedia(mediaToAnalyze)
analysisRequest.addAnalysis(analysis)
analysisRequest.run(
scenarioStateHandler: { state in }, // обработчик шагов сценария
uploadProgressHandler: { (progress) in } // обработчик для загрузки файлов 
) { (analysisResults : [OzAnalysisResult], error) in 
    // получение и обработка анализов 
    for result in analysisResults {
        print(result.resolution)
        print(result.folderID)
    }
}
Как интегрировать серверную проверку Liveness в ваше Web-приложение
Как интегрировать серверную проверку Liveness в ваше мобильное приложение
Как провести проверку медиафайла на Liveness без использования фронтенда Oz
Интеграция Oz Liveness Web SDK
Интеграция Oz Liveness Mobile SDK
метод
метод
метод
запрос
веб-консолью
руководстве разработчика
на нашем веб-сайте
свяжитесь с нами
метода авторизации
CocoaPods
метода авторизации
веб-консолью

Сравнение лиц

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

Как интегрировать проверку Liveness на устройстве в ваше мобильное приложение

Из этой статьи вы узнаете, как интегрировать Oz Liveness Mobile SDK в клиентское мобильное приложение: для съемки видео с лицом и дальнейшей его проверки на устройстве без отправки данных на сервер.

Oz Liveness Mobile SDK – это:

  • Готовый интерфейс для съемки видео, который легко встроить в приложение клиента.

  • Высокое качество видео, которое обеспечивает точность проверки Liveness.

Android

1. Добавьте SDK в проект

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

allprojects {
    repositories {
        maven { url "https://ozforensics.jfrog.io/artifactory/main" }
    }
}

В build.gradle модуля добавьте строки

dependencies {
    implementation 'com.ozforensics.liveness:full:<version>'
    // номер версии можно найти в журнале изменений для Android
}

2. Инициализируйте SDK

Переименуйте файл лицензии в forensics.license и поместите его в папку res/raw в вашем проекте.

OzLivenessSDK.init(
    context,
    listOf(LicenseSource.LicenseAssetId(R.raw.forensics))
)
OzLivenessSDK.INSTANCE.init(
        context,
        Collections.singletonList(new LicenseSource.LicenseAssetId(R.raw.forensics)),
        null
);

3. Запустите съемку видео

Для начала съемки используйте метод startActivityForResult:

val OZ_LIVENESS_REQUEST_CODE = 1
val intent = OzLivenessSDK.createStartIntent(listOf( OzAction.Blank)) startActivityForResult(intent, OZ_LIVENESS_REQUEST_CODE)
int OZ_LIVENESS_REQUEST_CODE = 1;
Intent intent = OzLivenessSDK.INSTANCE.createStartIntent(Collections.singletonList(OzAction.Blank));
startActivityForResult(intent, OZ_LIVENESS_REQUEST_CODE);

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

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == OZ_LIVENESS_REQUEST_CODE) {
            val sdkMediaResult = OzLivenessSDK.getResultFromIntent(data)
            val sdkErrorString = OzLivenessSDK.getErrorFromIntent(data)
            if (!sdkMediaResult.isNullOrEmpty()) {
                analyzeMedia(sdkMediaResult)
            } else println(sdkErrorString)
        }
    }
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == OZ_LIVENESS_REQUEST_CODE) {
        List<OzAbstractMedia> sdkMediaResult = OzLivenessSDK.INSTANCE.getResultFromIntent(data);
        String sdkErrorString = OzLivenessSDK.INSTANCE.getErrorFromIntent(data);
        if (sdkMediaResult != null && !sdkMediaResult.isEmpty()) {
            analyzeMedia(sdkMediaResult);
        } else System.out.println(sdkErrorString);
    }
}

Готовые видео содержатся в объекте sdkMediaResult.

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

Для запуска анализов используйте код ниже. mediaList – массив объектов, полученных из sdkMediaResult или извне (если вы снимали видео без использования нашего SDK).

private fun analyzeMedia(mediaList: List<OzAbstractMedia>) {
    AnalysisRequest.Builder()
        .addAnalysis(Analysis(Analysis.Type.QUALITY, Analysis.Mode.ON_DEVICE, mediaList))
        .build()
        .run(object : AnalysisRequest.AnalysisListener {
            override fun onSuccess(result: List<OzAnalysisResult>) {
                result.forEach { 
                    println(it.resolution.name)
                    println(it.folderId)
                }
            }
            override fun onError(error: OzException) {
                error.printStackTrace()
            }
        })
} 
private void analyzeMedia(List<OzAbstractMedia> mediaList) {
    new AnalysisRequest.Builder()
            .addAnalysis(new Analysis(Analysis.Type.QUALITY, Analysis.Mode.ON_DEVICE, mediaList, Collections.emptyMap()))
            .build()
            .run(new AnalysisRequest.AnalysisListener() {
                @Override public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) {}
                @Override
                public void onSuccess(@NonNull List<OzAnalysisResult> list) {
                    for (OzAnalysisResult result: list) {
                        System.out.println(result.getResolution().name());
                        System.out.println(result.getFolderId());
                    }
                }
                @Override
                public void onError(@NonNull OzException e) { e.printStackTrace(); }
    });
}

iOS

1. Добавьте SDK в проект

pod 'OZLivenessSDK', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios', :tag => '<version>' // You can find the version needed in  iOS changelog

2. Инициализируйте SDK

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

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

3. Запустите съемку видео

Создайте контроллер, который будет снимать видео:

let actions: [OZVerificationMovement] = [.selfie]
let ozLivenessVC: UIViewController = OZSDK.createVerificationVCWithDelegate(delegate, actions: actions) 
self.present(ozLivenessVC, animated: true)

В делегате используйте протокол OZLivenessDelegate:

let actions: [OZVerificationMovement] = [.selfie]
let ozLivenessVC: UIViewController = OZSDK.createVerificationVCWithDelegate(delegate, actions: actions) 
self.present(ozLivenessVC, animated: true)

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

Для запуска анализов используйте AnalysisRequestBuilder.

let analysisRequest = AnalysisRequestBuilder()
let analysis = Analysis.init(
media: mediaToAnalyze, 
type: .quality, 
mode: .onDevice)
analysisRequest.uploadMedia(mediaToAnalyze)
analysisRequest.addAnalysis(analysis)
analysisRequest.run(
scenarioStateHandler: { state in }, // обработчик шагов сценария
uploadProgressHandler: { (progress) in } // обработчик загрузки файлов
) { (analysisResults : [OzAnalysisResult], error) in 
    // получение и обработка результатов анализов
    for result in analysisResults {
        print(result.resolution)
        print(result.folderID)
    }
}

Шаги выше помогут вам в базовой интеграции наших мобильных SDK в ваше приложение. Данные анализов, выполненных в режиме «на устройстве» никуда не отправляются, поэтому, в отличие от данных серверных проверок, они не будут доступны через API или в веб-консоли. Однако обратите внимание: для проверки лицензии потребуется подключение к интернету. Мы также рекомендуем использовать наш сервис логирования – телеметрию. Записи телеметрии помогают в расследовании деталей атак. Необходимые учетные данные мы предоставим.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Результаты анализов – получение результатов анализов через API в численной форме.

Как интегрировать серверную проверку Liveness в ваше Web-приложение

Из этой статьи вы узнаете, как интегрировать Oz Liveness Web SDK в клиентское Web-приложение: для съемки видео с лицом и дальнейшей его проверки на сервере.

Преимущества Oz Liveness Web SDK:

  • Готовый интерфейс для съемки видео, который легко встроить в приложение клиента.

  • Высокое качество видео, которое обеспечивает точность проверки Liveness.

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

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

«Под капотом» Web SDK взаимодействует с OZ API.

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

  1. Получите доступ к персональной копии Web Adapter

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

Доменные имена:

  1. www.yourbrand.com

  2. www.yourbrand2.com

Электронная почта:

  • ivan.ivanov@yourcompany.com

Мы направим вам ссылки и логин с паролем для дальнейшей интеграции и использования Web SDK.

Логин: ivan.ivanov@yourcompany.com

Пароль: …

API: https://sandbox.ohio.ozforensics.com

Web-консоль: https://sandbox.ohio.ozforensics.com

Web Adapter: https://web-sdk.cdn.sandbox.ozforensics.com/your_company_name/

  1. Добавьте Web Plugin на вашу страницу

В HTML-коде страницы разместите следующее. web-adapter-url необходимо заменить на полученную от нас ссылку.

  1. Реализуйте собственную логику для использования Web Plugin

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

  • Настройка внешнего вида плагина

  • Добавление дополнительного языка

  • Настройка поведения плагина

  • Настройка параметров и коллбэк-функций

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

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

Проверка Liveness на устройстве

В этом разделе находится инструкция по интеграции проверки Liveness на устройстве.

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

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

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

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

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

через Web Plugin

для Android

для iOS

Android

iOS

в PlayMarket

в TestFlight

Для работы Oz Liveness Mobile SDK нужна лицензия, которая привязывается к bundle_id приложения, например com.yourcompany.yourapp. Тестовую лицензию на месяц вы можете оформить самостоятельно , если вам требуется лицензия на более длительный срок – .

Установите OZLivenessSDK через . Чтобы встроить SDK в проект Xcode, в Podfile добавьте:

для Android

для iOS

Android

iOS

в PlayMarket

в TestFlight

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

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

Шаги выше помогут вам в базовой интеграции Web SDK в ваше веб-приложение. Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь или API-запросами (получение и ).

Дальнейшие шаги описаны в :

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

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

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

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

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

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

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

Образец кода
Образец кода
Руководство разработчика
Руководство разработчика
Demo app
Demo app
Как сравнить лицо из снятого для проверки Liveness видео с лицом из вашей базы данных
Как добавить съемку документа и возможность сопоставления лиц в ваше веб- или мобильное приложение
на нашем веб-сайте
свяжитесь с нами
CocoaPods
Oz API
Oz API Lite
Oz Liveness Web SDK
iOS
Android
Liveness
Биометрия
Поиск лучшего кадра
Проверка по черному списку
Результаты анализов
Типы анализов
<script src="https:///plugin_liveness.php"></script>
OzLiveness.open({
  lang: 'en',
  action: [
    // 'photo_id_front', // фото документа
    'video_selfie_blank' // видео с пассивным Liveness
  ],
  on_complete: function (result) {
    // эта функция вызывается по завершении анализа
    console.log('on_complete', result);
  }
});
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"
        ]
    }
}
Образец кода
Образец кода
Руководство разработчика
Руководство разработчика
Demo app
Demo app
здесь
руководстве разработчика по Web Plugin
здесь
Angular
React
Как интегрировать проверку Liveness на устройстве в ваше мобильное приложение
теги
POST
POST
списка тегов для видео
специфичные для видео

Liveness

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

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

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

payload
{
  "media:tags": {
    "video1": [
      "video_selfie",
      "video_selfie_scan",
      "orientation_portrait"
    ]
  }
}
request body
{
  "analyses": [{
    "type": "quality",
    "source_media": ["6187a4ef-62c4-4445-bbb2-bf62d61f1fde"],
  }]
}

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

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

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

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

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

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

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

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

Чтобы получить токены доступа, нужно выполнить 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>}

  • для сервисных учетных записей – 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.

API

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

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

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

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

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
    }
  }]
}

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

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

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

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

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

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

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

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

  1. Для типа анализа 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-ответа.

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

CocoaPods

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

pod 'OZLivenessSDK', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios', :tag => 'VERSION'

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

// для установки последней версии
pod ‘OZLivenessSDK’
// ИЛИ для установки конкретной версии
// pod ‘OZLivenessSDK’, ‘8.10.0’

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

pod 'OZLivenessSDK/Core', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios.git',  :tag => 'VERSION'

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

pod ‘OZLivenessSDK/Core’
// ИЛИ
// pod ‘OZLivenessSDK/Core’, ‘8.1.0’

SPM

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

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

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

  • OZLivenessSDK.xcframework,

  • OZLivenessSDKResources.bundle,

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

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

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

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

Работа с черным списком (коллекцией) в Oz 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. Он понадобится на следующем шаге.

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

{
    "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}}/.

Биометрия

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

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

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, если хотите провести анализ всех медиа в папке в соответствии с установленными им тегам.

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

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

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

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

Объекты системы

Иерархия объектов

Объекты системы имеют иерархическую структуру подчинения.

  1. На верхнем уровне находится Компания. Это значит, что один экземпляр установки Oz API может обслуживать пользователей нескольких не зависящих друг от друга компаний.

Поля объектов

Каждый объект имеет набор полей для работы и идентификации на уровне REST API запросов.

Общие поля

Поле

Тип

Описание

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

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

results_data

Json

данные результата анализа

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

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

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

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

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

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

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

Biometry

Назначение

Результат

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

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

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

Quality (Liveness, Best Shot)

Назначение

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

Результат

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

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

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

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

Documents

Назначение

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

Результат

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

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

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

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

Blacklist

Назначение

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

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

Результат

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

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

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

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

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

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

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

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

    • 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 – нет действия.

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

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

  "video1": [
      "video_selfie",
      "video_selfie_eyes",
      "orientation_portrait"
    ]

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

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

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

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

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

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

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

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

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

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

  "photo1": [
      "photo_selfie"
  ]

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

"photo1": [
    "photo_id", "photo_id_front"
]

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

"photo1": [
    "photo_id", "photo_id_back"
]

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

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

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

Анализ выполняется для всех фото и видео.

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

Анализ выполняется только при наличии заранее созданного черного списка для всех присутствующих в папке / указанных в качестве источника фото и видео.

Это дополнительная опция к анализу Quality. Анализ выполняется для всех медиафайлов, подходящих для анализа Quality. Соответствующую настройку можно отключить.

Documents

Сверка лица с документами (анализ “Documents”) выполняется для медиафайлов с тегами photo_id_front, photo_id_back (документы) и photo_selfie (селфи). Результат сверки будет положительным, если есть фото лица и хотя бы один валидный документ (с фотографией того же лица) из списка ниже:

  • паспорт

  • водительские права

  • заграничный паспорт

Связанные с тегами ошибки

Роли пользователей

Роли указываются при создании новых пользователей и созданы для ограничения доступа к API при интеграции с прямым доступом.

Каждая роль комбинируется с флагами is_admin и is_service и в зависимости от них может менять поведение.

Флаг is_service предназначен для создания сервисных пользователей учётных записей для входа автоматизированным способом. При авторизации под таким пользователем выдаётся токен с долгим временем жизни (по умолчанию 5 лет). Время жизни токенов для обычных пользователей составляет 15 минут (параметризуется), по умолчанию время жизни токенов продлевается при каждом обращении (параметризуется).

  • ADMIN – Администратор системы. Имеет неограниченный доступ ко всем ресурсам системы через API, кроме принятия решений по анализам;

  • CLIENT – Клиентская учетная запись. В рамках своей компании имеет доступ к загрузке медиафайлов, запуску анализов, просмотру результатов в своих папках, выгрузке отчетности по заявке;

    • is_admin – если установлен, пользователь получает доступ к данным всех пользователей внутри своей компании

    • can_start_analyse_biometry – дополнительный флаг для ограничения доступа к проведению биометрии (по умолчанию разрешено)

    • can_start_analyse_quality – дополнительный флаг для ограничения доступа к проведению анализов Liveness (по умолчанию разрешено)

  • CLIENT ADMIN – администратор компании, который может управлять пользователями и аккаунтом своей компании. CLIENT ADMIN может просматривать данные всех пользователей и редактировать их, просматривать статистику, удалять файлы в папках, шаблоны отчетов вместе с вложениями, сами отчеты и отдельные анализы, а также может добавлять шаблоны отчетов и изображения в ЧС. Роль есть только в Web UI, вне Web UI она заменяется на роль CLIENT c флагом is_admin = true.

  • CLIENT OPERATOR – имеет такие же права, как и OPERATOR, но в рамках своей компании.

Подробное описание уровней доступа приведено ниже.

Компания

Папка

Шаблон отчета

Приложения к шаблону отчета

Отчет

Анализ

Коллекция

Персона

Фото персоны

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

Метаданные

Обзор

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

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

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

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

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

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

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

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

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

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

Коллекция Oz API

5.3 и 5.2

5.0

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

4.0

3.33

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

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

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

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

Статусы API

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

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

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

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

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

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

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

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

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

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

Наличие/отсутствие статуса 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 означает, что все проверки прошли успешно без каких-либо ошибок.

Oz API Lite

Рассказываем, как работать с Oz API Lite.

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

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

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

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

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

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

Журнал изменений API Core.

5.3.1 – 24.12.2024

  • Оптимизировали потребление серверных ресурсов при проведении биометрического анализа.

5.3.0 – 21.11.2024

  • Подготовили новый шаблон отчета, который также соответствует этим требованиям.

  • Миниатюры для нового отчета генерируются на основе кадров с действиями.

5.2.0 – 06.09.2024

  • Добавили метод проверки настроек таймзоны: 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.

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

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

1.2.0

1.1.1

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

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

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

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

веб-консолью
результатов анализов

.

.

3. .

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

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

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

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

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

.

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

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

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

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

.

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

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

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

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

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

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

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

.

.

3. .

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

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

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

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

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

любые

пароль, указывается при добавлении нового пользователя или при изменении пароля. Если пользователя не admin, необходимо указать поле password_old

см.

статус последнего папки

список для этого файла

(BIOMETRY\QUALITY\DOCUMENTS)

,

,

,

.

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

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

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

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

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

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

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

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

Список настроек по умолчанию приведен ниже. Для изменения конфигурации, пожалуйста, .

Анализ выполняется для всех медиафайлов вне зависимости от воспроизводимого в них (теги жестов начинаются с video_selfie).

OPERATOR – Системный оператор. Имеет неограниченный доступ на просмотр заявок и может принимать решения по анализам, с помощью кнопки Принять решение (обычно используется в случае появления OPERATOR_REQUIRED);

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

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

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

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

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

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

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

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

Обновили коллекцию Postman. Опубликовали новую коллекцию и на .

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

Авторизуйтесь
Поместите медиафайл в папку
Запустите анализ
проверьте результат
вебхук
здесь
Oz API
Oz API Lite
liveness
Авторизуйтесь.
Поместите видеофайл в папку
Запустите анализ
роверьте результат
вебхук
здесь
Авторизуйтесь
заявке
списку заявок
Журнале изменений
https://gitlab.com/oz-forensics/oz-mobile-ios-sdk
здесь описано
отсюда
здесь
Авторизуйтесь
Поместите медиафайлы в папку
Запустите анализ
проверьте результат
вебхук
здесь
роли
Анализ
Правилами назначения анализов
здесь
обратитесь к нам
Результаты анализов
Правила назначения анализов
liveness
отделом продаж
теги
biometry
quality (liveness, best shot)
documents
blacklist
Quality
Biometry

Код ошибки

Сообщение

Описание

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. Возможно, медиафайлам не установлены теги.

Создание

Чтение

Обновление

Удаление

ADMIN

+

+

+

+

OPERATOR

-

+

-

-

CLIENT

-

данные своей компании

-

-

CLIENT SERVICE

-

данные своей компании

-

-

CLIENT OPERATOR

-

данные своей компании

-

-

CLIENT ADMIN

-

данные своей компании

данные своей компании

данные своей компании

Создание

Чтение

Обновление

Удаление

ADMIN

+

+

+

+

OPERATOR

+

+

+

-

CLIENT

свои папки

свои папки

свои папки

-

CLIENT SERVICE

в рамках своей компании

в рамках своей компании

в рамках своей компании

-

CLIENT OPERATOR

в рамках своей компании

в рамках своей компании

в рамках своей компании

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

в рамках своей компании

Создание

Чтение

Обновление

Удаление

ADMIN

+

+

+

+

OPERATOR

+

+

+

-

CLIENT

-

в рамках своей компании

-

-

CLIENT SERVICE

-

в рамках своей компании

-

-

CLIENT OPERATOR

в рамках своей компании

в рамках своей компании

в рамках своей компании

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

в рамках своей компании

Создание

Чтение

Удаление

ADMIN

+

+

+

OPERATOR

+

+

-

CLIENT

-

в рамках своей компании

-

CLIENT SERVICE

-

в рамках своей компании

-

CLIENT OPERATOR

в рамках своей компании

в рамках своей компании

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

Создание

Чтение

Удаление

ADMIN

+

+

+

OPERATOR

+

+

-

CLIENT

по своим папкам

в своих папках

-

CLIENT SERVICE

в рамках своей компании

в рамках своей компании

-

CLIENT OPERATOR

в рамках своей компании

в рамках своей компании

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

Создание

Чтение

Обновление

Удаление

ADMIN

+

+

+

+

OPERATOR

+

+

+

-

CLIENT

в своих папках

в своих папках

-

-

CLIENT SERVICE

в рамках своей компании

в рамках своей компании

в рамках своей компании

-

CLIENT OPERATOR

в рамках своей компании

в рамках своей компании

в рамках своей компании

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

в рамках своей компании

Создание

Чтение

Обновление

Удаление

ADMIN

+

+

+

+

OPERATOR

-

+

-

-

CLIENT

-

в рамках своей компании

-

-

CLIENT SERVICE

в рамках своей компании

в рамках своей компании

-

-

CLIENT OPERATOR

-

в рамках своей компании

-

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

в рамках своей компании

Создание

Чтение

Удаление

ADMIN

+

+

+

OPERATOR

-

+

-

CLIENT

-

в рамках своей компании

-

CLIENT SERVICE

в рамках своей компании

в рамках своей компании

-

CLIENT OPERATOR

-

в рамках своей компании

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

Создание

Чтение

Удаление

ADMIN

+

+

+

OPERATOR

-

+

-

CLIENT

-

в рамках своей компании

-

CLIENT SERVICE

-

в рамках своей компании

-

CLIENT OPERATOR

-

в рамках своей компании

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

Создание

Чтение

Обновление

Удаление

ADMIN

+

+

+

+

OPERATOR

-

+

свои данные

-

CLIENT

-

свои данные

свои данные

-

CLIENT SERVICE

-

в рамках своей компании

свои данные

-

CLIENT OPERATOR

-

в рамках своей компании

свои данные

-

CLIENT ADMIN

в рамках своей компании

в рамках своей компании

в рамках своей компании

в рамках своей компании

…
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

{
  "iin": "123123123"
}
коллекции Postman
коллекция Postman

INITIAL

-

-

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

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

PROCESSING

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

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

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

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

FAILED

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

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

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

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

FINISHED

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

-

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

DECLINED

-

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

-

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

OPERATOR_REQUIRED

-

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

-

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

SUCCESS

-

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

-

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

Статусы API

Методы API Lite

Начиная с версии 1.1.0, Oz API Lite может принимать изображения и шаблоны в формате base64, а также возвращать в этом формате шаблоны биометрических проверок. Для включения этой опции необходимо в headers запроса передать Content-Transfer-Encoding = base64.

version – проверка версии компонентов

С помощью этого метода можно узнать, какие версии компонентов используются (начиная с версии 1.1.1).

Call GET /version

Входные параметры

-

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

GET localhost/version

Успешный ответ метода

В случае успешного ответа метод возвращает сообщение со следующими параметрами.

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

core

String

Версия API Lite.

tfss

String

Версия TFSS.

models

[String]

Массив версий моделей, где каждая запись содержит информацию о названии модели и ее версии.

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

200 OK
Content-Type: application/json
{
2	"core": "core_version",
3	"tfss": "tfss_version",
4	"models": [
5		{
6			"name": "model_name",
7			"version": "model_version"
8		}
9	]
10}

Биометрия

health – проверка состояния биометрического процессора biometry

С помощью этого метода можно проверить, корректно ли работает процессор.

Вызов метода: GET /v1/face/pattern/health

Входные параметры

-

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

GET localhost/v1/face/pattern/health

Успешный ответ метода

В случае успешного ответа метод возвращает сообщение со следующими параметрами.

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

status

Int

0 – биометрический процессор работает корректно.

3 – биометрический процессор неработоспособен.

message

String

Сообщение.

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

200 OK
Content-Type: application/json
{“status”: 0, message: “”}

extract – извлечение биометрического шаблона

Метод предназначен для извлечения биометрического шаблона из изображения. Тип контента HTTP-запроса: “image/jpeg” или “image/png”

Вызов метода: POST /v1/face/pattern/extract

Входные параметры

Наименование параметра

Тип

Описание

Не указывается*

Stream

Обязательный параметр. Изображение для извлечения биометрического шаблона. В заголовочном поле “Content-Type” должен быть указан тип контента.

*

Для параметров типа Stream имя указывать не нужно.

Для передачи данных в base64 необходимо в headers запроса передать Content-Transfer-Encoding = base64.

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

POST localhost/v1/face/pattern/extract
Content-Type: image/jpeg
{Поток байт изображения}

Успешный ответ метода

В случае успешного ответа метод возвращает биометрический шаблон.

Тип контента HTTP-ответа: “application/octet-stream”.

Если в headers запроса передавалось поле Content-Transfer-Encoding со значением base64, то шаблон тоже вернется в base64.

Выходные параметры

Наименование параметра

Тип

Описание

Не указывается*

Stream

Биометрический шаблон, полученный из изображения

*

Для параметров типа Stream имя указывать не нужно.

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

200 OK
Content-Type: application/octet-stream
{Поток байт биометрического шаблона}

compare – сравнение биометрических шаблонов

Метод предназначен для сравнения двух биометрических шаблонов.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: POST /v1/face/pattern/compare

Входные параметры

Наименование параметра

Тип

Описание

bio_feature

Stream

Обязательный параметр. Первый биометрический шаблон.

bio_template

Stream

Обязательный параметр. Второй биометрический шаблон.

Для передачи данных в base64 необходимо в headers запроса передать Content-Transfer-Encoding = base64.

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

POST localhost/v1/face/pattern/compare
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”bio_feature”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”bio_template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--

Успешный ответ метода

В случае успешного ответа метод возвращает результат сравнения двух шаблонов.

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

score

Float

Результат сравнения двух шаблонов

decision

String

Рекомендуемое решение по полученному score.

approved – положительный результат. Лица совпадают.

operator_required – требуется дополнительная проверка оператора.

declined – негативный результат. Лица не совпадают.

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

200 OK
Content-Type: application/json
{“score”: 1.0, “decision”: “approved”}

verify – биометрическая верификация

Метод объединяет два описанных выше метода extract и compare – извлекает биометрический шаблон из изображения и сравнивает его с другим биометрическим шаблоном, который также передается в запросе.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: POST /v1/face/pattern/verify

Входные параметры

Наименование параметра

Тип

Описание

sample

Stream

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

bio_template

Stream

Обязательный параметр. Биометрический шаблон, с которым производится сравнение.

Для передачи данных в base64 необходимо в headers запроса передать Content-Transfer-Encoding = base64.

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

POST localhost/v1/face/pattern/verify
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”bio_template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”sample”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--

Успешный ответ метода

В случае успешного ответа метод возвращает результат сравнения двух биометрических шаблонов.

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

score

Float

Результат сравнения двух шаблонов

decision

String

Рекомендуемое решение по полученному score.

approved – положительный результат. Лица совпадают.

operator_required – требуется дополнительная проверка оператора.

declined – негативный результат. Лица не совпадают.

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

200 OK
Content-Type: application/json
{“score”: 1.0, “decision”: “approved”}

extract_and_compare – извлечение из двух изображений и сравнение полученных шаблонов

Метод объединяет два описанных выше метода extract и compare. Он извлекает биометрические шаблоны из двух изображений, сравнивает их и в качестве ответа передает результат сравнения.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: POST /v1/face/pattern/extract_and_compare

Входные параметры

Наименование параметра

Тип

Описание

sample_1

Stream

Обязательный параметр. Первое изображение.

sample_2

Stream

Обязательный параметр. Второе изображение

Для передачи данных в base64 необходимо в headers запроса передать Content-Transfer-Encoding = base64.

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

POST localhost/v1/face/pattern/extract_and_compare
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”sample_1”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”sample_2”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--

Успешный ответ метода

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

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

score

Float

Результат сравнения двух извлеченных шаблонов

decision

String

Рекомендуемое решение по полученному score.

approved – положительный результат. Лица совпадают.

operator_required – требуется дополнительная проверка оператора.

declined – негативный результат. Лица не совпадают.

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

200 OK
Content-Type: application/json
{“score”: 1.0, “decision”: “approved”}

compare_n – сравнение биометрических шаблонов 1:N

Метод предназначен для сравнения биометрических шаблонов в режиме 1:N.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: POST /v1/face/pattern/compare_n

Входные параметры

Наименование параметра

Тип

Описание

template_1

Stream

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

Биометрический шаблон – кандидат(1).

templates_n

Stream

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

Список(N) биометрических шаблонов. Каждый биометрический шаблон должен быть передан отдельно, но необходимо чтобы имя параметра было templates_n. Также требуется, чтобы в заголовке был передан filename.

Для передачи данных в base64 необходимо в headers запроса передать Content-Transfer-Encoding = base64.

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

POST localhost/v1/face/pattern/compare_n
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”template_1”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”1.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”2.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”3.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--

Успешный ответ метода

В случае успешного ответа метод возвращает результаты сравнений 1:N .

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

results

List[JSON]

Список результатов сравнения кандидата со списком(N). Для каждого сравнения из списка(N) результат имеет следующие поля:

*filename

String

Значение filename в заголовке соответствующего шаблона из списка(N).

*score

Float

Результат сравнения кандидата с соответствующим шаблоном из списка(N).

*decision

String

Рекомендуемое решение по полученному score.

approved - положительный результат. Лица совпадают.

operator_required - требуется дополнительная проверка оператора.

declined - негативный результат. Лица не совпадают.

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

200 OK
Content-Type: application/json
{'results': [
    {'filename': '1.template', 'score': 0.0, 'decision': 'declined'}, 
    {'filename': '2.template', 'score': 1.0, 'decision': 'approved'}, 
    {'filename': '3.template', 'score': 0.21, 'decision': 'declined'}
]}

verify_n – биометрическая верификация 1:N

Метод объединяет два описанных выше метода extract и compare_n. Метод извлекает биометрический шаблон из изображения и сравнивает его cо списком биометрических шаблонов, которые также передаются в запросе.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: POST /v1/face/pattern/verify_n

Входные параметры

Наименование параметра

Тип

Описание

sample_1

Stream

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

Изображение - кандидат(1).

templates_n

Stream

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

Список(N) биометрических шаблонов. Каждый биометрический шаблон должен быть передан отдельно, но необходимо чтобы имя параметра было templates_n. Также требуется, чтобы в заголовке был передан filename.

Для передачи данных в base64 необходимо в headers запроса передать Content-Transfer-Encoding = base64.

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

POST localhost/v1/face/pattern/verify_n
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”sample_1”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”1.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”2.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--
Content-Disposition: form-data; name=”templates_n”; filename=”3.template”
Content_type: application/octet-stream
{Поток байт биометрического шаблона}
--BOUNDARY--

Успешный ответ метода

В случае успешного ответа метод возвращает результаты сравнений 1:N .

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

results

List[JSON]

Список результатов сравнения кандидата со списком(N). Для каждого сравнения из списка(N) результат имеет следующие поля:

*filename

String

Значение filename в заголовке соответствующего шаблона из списка(N).

*score

Float

Результат сравнения кандидата с соответствующим шаблоном из списка(N).

*decision

String

Рекомендуемое решение по полученному score.

approved - положительный результат. Лица совпадают.

operator_required - требуется дополнительная проверка оператора.

declined - негативный результат. Лица не совпадают.

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

200 OK
Content-Type: application/json
{'results': [
    {'filename': '1.template', 'score': 0.0, 'decision': 'declined'}, 
    {'filename': '2.template', 'score': 1.0, 'decision': 'approved'}, 
    {'filename': '3.template', 'score': 0.21, 'decision': 'declined'}
]}

extract_and_compare_n – извлечение и сравнение полученных шаблонов 1:N

Метод объединяет два описанных выше метода extract и compare_n. Он извлекает биометрические шаблоны из изображения-кандидата и изображений из списка, а затем сравнивает их в режиме 1:N.

Тип контента HTTP-запроса: “multipart/form-data”.

Вызов метода: POST /v1/face/pattern/extract_and_compare_n

Входные параметры

Наименование параметра

Тип

Описание

sample_1

Stream

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

Изображение – кандидат(1).

samples_n

Stream

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

Список(N) изображений. Каждое изображение должно быть передано отдельно, но необходимо чтобы имя параметра было samples_n. Также требуется, чтобы в заголовке был передан filename.

Для передачи данных в base64 необходимо в headers запроса передать Content-Transfer-Encoding = base64.

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

POST localhost/v1/face/pattern/extract_and_compare_n
Content-Type: multipart/form-data;
boundary=--BOUNDARY--
Content-Length: Длина тела сообщения
--BOUNDARY--
Content-Disposition: form-data; name=”sample_1”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”samples_n”; filename=”1.jpeg”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”samples_n”; filename=”2.jpeg”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--
Content-Disposition: form-data; name=”samples_n”; filename=”3.jpeg”
Content_type: image/jpeg
{Поток байт изображения}
--BOUNDARY--

Успешный ответ метода

В случае успешного ответа метод возвращает результаты сравнений 1:N .

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

results

List[JSON]

Список результатов сравнения кандидата со списком(N). Для каждого сравнения из списка(N) результат имеет следующие поля:

*filename

String

Значение filename в заголовке соответствующего изображения из списка(N).

*score

Float

Результат сравнения кандидата с соответствующим изображением из списка(N).

*decision

String

Рекомендуемое решение по полученному score.

approved – положительный результат. Лица совпадают.

operator_required – требуется дополнительная проверка оператора.

declined – негативный результат. Лица не совпадают.

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

200 OK
Content-Type: application/json
{'results': [
    {'filename': '1.jpeg', 'score': 0.0, 'decision': 'declined'}, 
    {'filename': '2.jpeg', 'score': 1.0, 'decision': 'approved'}, 
    {'filename': '3.jpeg', 'score': 0.21, 'decision': 'declined'}
]}

Ошибки методов

Тип контента HTTP-ответа: “application/json”.

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

Значение параметра “code”

Описание

400

BPE-002001

Неверный Content-Type HTTP-запроса

400

BPE-002002

Неверный метод HTTP-запроса

400

BPE-002003

Не удалось прочитать *биометрический образец

400

BPE-002004

Не удалось прочитать биометрический шаблон

400

BPE-002005

Неверный Content-Type части multiparted HTTPзапроса

400

BPE-003001

Не удалось извлечь биометрический шаблон

400

BPE-003002

На биометрическом образце* отсутствует лицо

400

BPE-003003

На биометрическом образце* присутствует более одного лица

500

BPE-001001

Внутренняя ошибка биопроцессора

400

BPE-001002

Ошибка TFSS. Необходимо вызвать метод biometry health.

*

Биометрический образец – входное изображение.

Liveness

health – проверка состояния биометрического процессора liveness

Вызов метода: GET /v1/face/liveness/health

Входные параметры отсутствуют.

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

GET localhost/v1/face/liveness/health

Успешный ответ метода

В случае успешного ответа метод возвращает сообщение со следующими параметрами.

Тип контента HTTP-ответа: “application/json”.

Выходные параметры

Наименование параметра

Тип

Описание

status

Int

0 - биометрический процессор работает корректно.

3 - биометрический процессор неработоспособен.

message

String

Сообщение.

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

200 OK
Content-Type: application/json
{“status”: 0, message: “”}

detect – обнаружение презентационных атак

Метод detect предназначен для обнаружения презентационных атак. Он ищет лицо на каждом изображении или видео (с версии 1.2.0), отправляет найденные лица на анализ и возвращает результат.

Поддерживаются следующие Content-Type:

  • image/jpeg или image/png для изображения;

  • multipart/form-data для изображений, видео или архивов. Для добавления дополнительных параметров, влияющих на анализ, используйте payload.

Запуск метода:POST /{version}/face/liveness/detect.

Изображение

Принимает изображение в формате JPEG или PNG; без payload.

Пример запроса
POST /v1/face/liveness/detect HTTP/1.1
Host: localhost
Content-Type: image/jpeg
Content-Length: [длина тела сообщения]
[поток байт изображения]
Пример успешного ответа
HTTP/1.1 200 OK
Content-Type: application/json
{
  "passed": false,
  "score": 0.999484062
}

Multipart/form-data

Принимает запрос multipart/form-data.

  • Название каждого медиафайла должно быть уникальным, например, media_key1, media_key2.

  • Параметры payload должны быть в виде JSON, помещенного в поле payload.

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

Пример запроса
POST /v1/face/liveness/detect HTTP/1.1
Host: localhost
Content-Length: [длина тела сообщения]
Content-Type: multipart/form-data; boundary=--BOUNDARY--

--BOUNDARY--
Content-Disposition: form-data; name="media_key1"; filename="video.mp4"
Content-Type: multipart/form-data; 

[поток байт медиафайла]
--BOUNDARY--
Content-Disposition: form-data; name="payload"

    {
        "folder:meta_data": {
            "partner_side_folder_id": "partner_side_folder_id_if_needed",
            "person_info": {
                "first_name": "John",
                "middle_name": "Jameson",
                "last_name": "Doe"
            }
        },
        "resolution_endpoint": "https://www.your-custom-endpoint.com",
        "media:meta_data": {
            "media_key1": {
                "foo": "bar2"
            }
        },
        "media:tags": {
            "media_key1": [
                "video_selfie",
                "video_selfie_blank"
            ]
        },
        "analyses": [
          {
            "type": "quality",
            "meta_data": {
              "example1": "some_example1"
            },
            "params": {
                "threshold_spoofing": 0.6,
                "extract_best_shot": false
            }
          }
]
    }
--BOUNDARY--
Пример успешного ответа
{
    "company_id": null,
    "time_created": 1720180784.769608,
    "folder_id": "folder_id", // временный ID
    "user_id": null,
    "resolution_endpoint": "https://www.your-custom-endpoint.com",
    "resolution_status": "FINISHED",
    "resolution_comment": "[]",
    "system_resolution": "SUCCESS",
    "resolution_time": null,
    "resolution_author_id": null,
    "resolution_state_hash": null,
    "operator_comment": null,
    "operator_status": null,
    "is_cleared": null,
    "meta_data": {
        "partner_side_folder_id": "partner_side_folder_id_if_needed",
        "person_info": {
            "first_name": "John",
            "middle_name": "Jameson",
            "last_name": "Doe"
        }
    },
    "technical_meta_data": {},
    "time_updated": 1720180787.531983,
    "media": [
        {
            "folder_id": "folder_id", // временный ID
            "media_id": "video_id", // временный ID
            "media_type": "VIDEO_FOLDER",
            "info": {
                "thumb": null,
                "video": {
                    "duration": 3.76,
                    "FPS": 22.83,
                    "width": 960,
                    "height": 720,
                    "md5": "8879b4fa9ee7add77aceb8d7d5d7b92d",
                    "size": 6017119,
                    "mime-type": "video/mp4"
                }
            },
            "tags": [
                "video_selfie",
                "video_selfie_blank",
                "orientation_portrait"
            ],
            "original_name": "video-5mb.mp4",
            "original_url": null,
            "company_id": null,
            "technical_meta_data": {},
            "time_created": 1719573752.78253,
            "time_updated": 1720180787.531801,
            "meta_data": {
                "foo4": "bar5"
            },
            "thumb_url": null,
            "folder_time_created": null,
            "video_id": "video_id", // временный ID
            "video_url": null
        }
    ],
    "analyses": [
        {
            "analyse_id": null,
            "analysis_id": null,
            "folder_id": "folder_id", // временный ID
            "folder_time_created": null,
            "type": "QUALITY",
            "state": "FINISHED",
            "company_id": null,
            "group_id": null,
            "results_data": null,
            "confs": {
                "threshold_replay": 0.5,
                "extract_best_shot": false,
                "threshold_liveness": 0.5,
                "threshold_spoofing": 0.42
            },
            "error_message": null,
            "error_code": null,
            "resolution_operator": null,
            "technical_meta_data": {},
            "time_created": 1720180784.769944,
            "time_updated": 1720180787.531877,
            "meta_data": {
                "some_key": "some_value"
            },
            "source_media": [
                {
                    "folder_id": "folder_id", // временный ID
                    "media_id": "video_id", // временный ID
                    "media_type": "VIDEO_FOLDER",
                    "info": {
                        "thumb": null,
                        "video": {
                            "duration": 3.76,
                            "FPS": 22.83,
                            "width": 960,
                            "height": 720,
                            "md5": "8879b4fa9ee7add77aceb8d7d5d7b92d",
                            "size": 6017119,
                            "mime-type": "video/mp4"
                        }
                    },
                    "tags": [
                        "video_selfie",
                        "video_selfie_blank",
                        "orientation_portrait"
                    ],
                    "original_name": "video-5mb.mp4",
                    "original_url": null,
                    "company_id": null,
                    "technical_meta_data": {},
                    "time_created": 1719573752.78253,
                    "time_updated": 1720180787.531801,
                    "meta_data": {
                        "foo4": "bar5"
                    },
                    "thumb_url": null,
                    "folder_time_created": null,
                    "video_id": "video_id", // временный ID
                    "video_url": null
                }
            ],
            "results_media": [
                {
                    "company_id": null,
                    "media_association_id": "video_id", // временный ID
                    "analysis_id": null,
                    "results_data": {
                        "confidence_spoofing": 0.000541269779
                    },
                    "source_media_id": "video_id", // временный ID
                    "output_images": [],
                    "collection_persons": [],
                    "folder_time_created": null
                }
            ],
            "resolution_status": "SUCCESS",
            "resolution": "SUCCESS"
        }
    ]
}

Multipart/form-data с Best Shot

Для извлечения лучшего кадра укажите в блоке analyses в payload extract_best_shot = true (как в примере запроса ниже). В таком случае API Lite после анализа ваших медиафайлов вернет в ответе лучший кадр – изображение в base64 будет в analysis->output_images->image_b64. Лучший кадр можно извлекать только из видео или архивов.

Также в блоке analyses вы можете изменить порог для прохождения Liveness в параметре threshold_spoofing: если итоговая оценка выше значения этого параметра, результат анализа будет DECLINED, в ином случае проверка Liveness будет считаться пройденной.

Пример запроса
POST /v1/face/liveness/detect HTTP/1.1
Host: localhost
Content-Length: [длина тела сообщения]
Content-Type: multipart/form-data; boundary=--BOUNDARY--

--BOUNDARY--
Content-Disposition: form-data; name="media_key1"; filename="video.mp4"
Content-Type: multipart/form-data; 

[поток байт медиафайла]
--BOUNDARY--
Content-Disposition: form-data; name="payload"

    {
        "folder:meta_data": {
            "partner_side_folder_id": "partner_side_folder_id_if_needed",
            "person_info": {
                "first_name": "John",
                "middle_name": "Jameson",
                "last_name": "Doe"
            }
        },
        "resolution_endpoint": "https://www.your-custom-endpoint.com",
        "media:meta_data": {
            "media_key1": {
                "foo": "bar2"
            }
        },
        "media:tags": {
            "media_key1": [
                "video_selfie",
                "video_selfie_blank"
            ]
        },
        "analyses": [
          {
            "type": "quality",
            "meta_data": {
              "example1": "some_example1"
            },
            "params": {
                "threshold_spoofing": 0.6,
                "extract_best_shot": true
            }
          }
]
    }
--BOUNDARY--
Пример успешного ответа
{
    "company_id": null,
    "time_created": 1720177371.120899,
    "folder_id": "folder_id", // временный ID
    "user_id": null,
    "resolution_endpoint": "https://www.your-custom-endpoint.com",
    "resolution_status": "FINISHED",
    "resolution_comment": "[]",
    "system_resolution": "SUCCESS",
    "resolution_time": null,
    "resolution_author_id": null,
    "resolution_state_hash": null,
    "operator_comment": null,
    "operator_status": null,
    "is_cleared": null,
    "meta_data": {
        "partner_side_folder_id": "partner_side_folder_id_if_needed",
        "person_info": {
            "first_name": "John",
            "middle_name": "Jameson",
            "last_name": "Doe"
        }
    },
    "technical_meta_data": {},
    "time_updated": 1720177375.531137,
    "media": [
        {
            "folder_id": "folder_id", // временный ID
            "media_id": "media_id", // временный ID
            "media_type": "VIDEO_FOLDER",
            "info": {
                "thumb": null,
                "video": {
                    "duration": 3.76,
                    "FPS": 22.83,
                    "width": 960,
                    "height": 720,
                    "md5": "8879b4fa9ee7add77aceb8d7d5d7b92d",
                    "size": 6017119,
                    "mime-type": "video/mp4"
                }
            },
            "tags": [
                "video_selfie",
                "video_selfie_blank",
                "orientation_portrait"
            ],
            "original_name": "video-5mb.mp4",
            "original_url": null,
            "company_id": null,
            "technical_meta_data": {},
            "time_created": 1719573752.781861,
            "time_updated": 1720177373.772401,
            "meta_data": {
                "foo4": "bar5"
            },
            "thumb_url": null,
            "folder_time_created": null,
            "video_id": "media_id", // временный ID
            "video_url": null
        }
    ],
    "analyses": [
        {
            "analyse_id": null,
            "analysis_id": null,
            "folder_id": "folder_id", // временный ID
            "folder_time_created": null,
            "type": "QUALITY",
            "state": "FINISHED",
            "company_id": null,
            "group_id": null,
            "results_data": null,
            "confs": {
                "threshold_replay": 0.5,
                "extract_best_shot": true,
                "threshold_liveness": 0.5,
                "threshold_spoofing": 0.42
            },
            "error_message": null,
            "error_code": null,
            "resolution_operator": null,
            "technical_meta_data": {},
            "time_created": 1720177371.121241,
            "time_updated": 1720177375.531043,
            "meta_data": {
                "some_key": "some_value"
            },
            "source_media": [
                {
                    "folder_id": "folder_id", // временный ID
                    "media_id": "media_id", // временный ID
                    "media_type": "VIDEO_FOLDER",
                    "info": {
                        "thumb": null,
                        "video": {
                            "duration": 3.76,
                            "FPS": 22.83,
                            "width": 960,
                            "height": 720,
                            "md5": "8879b4fa9ee7add77aceb8d7d5d7b92d",
                            "size": 6017119,
                            "mime-type": "video/mp4"
                        }
                    },
                    "tags": [
                        "video_selfie",
                        "video_selfie_blank",
                        "orientation_portrait"
                    ],
                    "original_name": "video-5mb.mp4",
                    "original_url": null,
                    "company_id": null,
                    "technical_meta_data": {},
                    "time_created": 1719573752.781861,
                    "time_updated": 1720177373.772401,
                    "meta_data": {
                        "foo4": "bar5"
                    },
                    "thumb_url": null,
                    "folder_time_created": null,
                    "video_id": "media_id", // временный ID
                    "video_url": null
                }
            ],
            "results_media": [
                {
                    "company_id": null,
                    "media_association_id": "media_id", // временный ID
                    "analysis_id": null,
                    "results_data": {
                        "confidence_spoofing": 0.000541269779
                    },
                    "source_media_id": "media_id", // temporary ID
                    "output_images": [
                        {
                            "folder_id": "folder_id", // временный ID
                            "media_id": "media_id", // временный ID
                            "media_type": "IMAGE_RESULT_ANALYSIS_SINGLE",
                            "info": {
                                "thumb": null,
                                "original": {
                                    "md5": "e6effeceb94e79b8cb204c6652283b57",
                                    "width": 720,
                                    "height": 960,
                                    "size": 145178,
                                    "mime-type": "image/jpeg"
                                }
                            },
                            "tags": [],
                            "original_name": "<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=720x960 at 0x766811DF8E90>",
                            "original_url": null,
                            "company_id": null,
                            "technical_meta_data": {},
                            "time_created": 1719573752.781861,
                            "time_updated": 1719573752.781871,
                            "meta_data": null,
                            "folder_time_created": null,
                            "image_b64": "",
                            "media_association_id": "media_id" // временный ID
                        }
                    ],
                    "collection_persons": [],
                    "folder_time_created": null
                }
            ],
            "resolution_status": "SUCCESS",
            "resolution": "SUCCESS"
        }
    ]
}
Поле payload
{
    "folder:meta_data": {
        "partner_side_folder_id": "partner_side_folder_id_if_needed",
        "person_info": {
            "first_name": "John",
            "middle_name": "Jameson",
            "last_name": "Doe"
        }   },
    "resolution_endpoint": "https://www.your-custom-endpoint.com",
    "media:meta_data": {
        "media_key1": {
            "foo": "bar2",
            "additional_info": "additional_info" // может влиять на оценку
        },
        "media_key2": {
            "foo2": "bar3"
        },
        "media_key3": {
            "foo4": "bar5"
        }
    },
    "media:tags": {
        "media_key1": [
            "video_selfie",
            "video_selfie_blank",
            "orientation_portrait"
        ],
        "media_key2": [
            "photo_selfie"
        ],
        "media_key3": [
            "video_selfie",
            "video_selfie_blank",
            "orientation_portrait"
        ]
    },
"analyses": [
    {
      "type": "quality",
      "meta_data": {
        "some_key": "some_value"
      },
      "params": {
      	"threshold_spoofing": 0.42, // влияет на результат
      	"extract_best_shot":true // вернется лучший кадр
      }
    }
  ]
}

Ошибки методов

Тип контента HTTP-ответа: “application/json”.

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

Значение параметра “code”

Описание

400

LDE-002001

Неверный Content-type HTTP-запроса

400

LDE-002002

Неверный метод HTTP-запроса

400

LDE-002004

Не удалось прочитать биометрический образец*

400

LDE-002005

Неверный Content-Type части multiparted HTTP-запроса

500

LDE-001001

Внутренняя ошибка БП обнаружения витальности

400

LDE-001002

Ошибка TFSS. Необходимо вызвать метод liveness health.

*

Биометрический образец – входное изображение.

пользовательские поля
роль пользователя в системе
роль
роли пользователей
флаг админа
флаг сервисного пользователя
анализа
тегов
тип анализа
теги
напишите нам
Quality (Liveness)
жеста
Biometry
Blacklist
Best Shot
статуса
объекта системы
документации по API.
здесь
Web
ссылке
оператор
облегченная
здесь
здесь
ссылке
https://apidoc.ozforensics.com/
здесь
метод
метод
метод
метод
метода
Android

Oz Mobile SDK (iOS, Android, Flutter)

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

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

SDK

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

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

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

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

Android

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

Чтобы начать пользоваться нашим 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:

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

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

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
  }
}

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

Мастер-лицензия – это оффлайн-лицензия, с которой можно использовать мобильные 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 rsa -pubout -in privateKey.der -out publicKey.pub

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

Интеграция SDK

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

fun init(
    context: Context,
    licenseSources: List<LicenseSource>,
    masterLicenseSignature: String,
    statusListener: StatusListener<LicensePayload>? = null,
 )

Для 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 хостового приложения с помощью приватного ключа.

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

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", "")
 }
Пример подписи для com.ozforensics.liveness.demo

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

KohJ1rsUgLMzZHpHGAZDK2efHPnMj9tw9VIedBLvyZt0B2JH3SWfJLJ8X6JNz3bR2sce6PR2wdEIFln0r1pUnD+6WBCgexKIHAv7esiRVQZoZOEANDBwDvJVv73H/0qL2LGlhxKzbBg5CxGPClTBQdLo1P+7HsTXHHG/Hf6m3rdu1OUeGXVPoaS2NzE8kiRH6gb8Nhr7PBLTUeMKTeLoiX13hvwjOqhV1ANhgS97T4hC2+ZilZt4RektgRY/+fGmWnOqErNeYuz/WSInfaJS0YEWhJW3gXKPjdCzNGIBIqbxaFSjU46wu/alh2+tBRFnrYFl1dRQVcTlW0VwwZHcug==

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

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

Съемка видео

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

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: {/* вывод ошибки */}
            }
        });

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

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);
    }

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

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

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

when (resultCode) {
    Activity.RESULT_CANCELED -> *USER CLOSED THE SCREEN*
    OzLivenessResultCode.SUCCESS -> {
        val sdkMediaResult = OzLivenessSDK.getResultFromIntent(data)
        *SUCCESS*
    }
    else -> {
        val errorMessage = OzLivenessSDK.getErrorFromIntent(data)
        *FAILURE*
    }
}

Настройка Android SDK

Настройки Oz Mobile SDK

Применять настройки рекомендуется при старте приложения.

// подключение к серверу 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);

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

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),
    )
)
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)
    )
 )
);

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

OzLivenessSDK.config.localizationCode = OzLivenessSDK.OzLocalizationCode.RU
OzLivenessSDK.INSTANCE.getConfig().setLocalizationCode(OzLivenessSDK.OzLocalizationCode.RU);

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

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

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

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

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); } //или ваш обработчик шагов сценария 
        });

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

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

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

    .addFolderMeta(
        mapOf(
            "key1" to "value1",
            "key2" to "value2"
        )
    )
.addFolderMeta(Collections.singletonMap("key", "value")) 

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

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

mapOf("extract_best_shot" to true)

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

       val file = File(context.filesDir, "media.mp4") // замените context.filesDir на context.getExternalFilesDir(null) для внешнего хранилища смартфона
       val media = OzAbsractMedia.OzVideo(OzMediaTag.VideoSelfieSmile, file.absolutePath)

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

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

    .setFolderId(folderId)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

или

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

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

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

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

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

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

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

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

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

LogOut:

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

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

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

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

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

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

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

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

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

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

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

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

Интеграция SDK

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

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

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

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

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

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

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

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

iOS

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

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

Ресурсы

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

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

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

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

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

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

Добавили

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Android
iOS
Oz Mobile SDK (iOS, Android, Flutter)
Oz Liveness Web SDK
здесь
сайте
электронной почте
здесь
Подключите
режим анализа на устройстве
здесь
Здесь
здесь
Методы и поля Android SDK
ссылке
Журнале изменений
https://www.openssl.org/docs/man1.1.1/man1/openssl-pkcs8.html
Fragment
Типы анализов
Liveness detect
метод для проверки версий компонентов
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
    ),
)
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 // непрозрачность фона (в %)
),
  )
);
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)
      }
    }

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.

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

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://tm.ozforensics.com/",
        "<your_telemetry_user_eg_tm@company.com>",
        "your_telemetry_password"
    )
)
OzLivenessSDK.setEventsConnection(
        OzConnection.fromCredentials(
                "https://tm.ozforensics.com/",
                "<your_telemetry_user_eg_tm@company.com>",
                "your_telemetry_password"
        )
);
OzLivenessSDK.setApiConnection(null)
OzLivenessSDK.INSTANCE.setApiConnection(null, null);
val isLoggedIn = OzLivenessSDK.isLoggedIn
boolean isLoggedIn = OzLivenessSDK.INSTANCE.isLoggedIn();
OzLivenessSDK.logout()
OzLivenessSDK.INSTANCE.logout();
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.pem -out publicKey.pub
base64 -w 0 publicKey.pub > publicKey.txt
OZSDK(licenseSources: [LicenseSource], masterLicenseSignature: String? = nil, completion: @escaping ((LicenseData?, LicenseError?) -> Void))
setLicense(licenseSource: LicenseSource, masterLicenseSignature: String? = nil)
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()
  }

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

Если вы при обновлении с прежних версий (до 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)
здесь
здесь
email
токен доступа
https://www.openssl.org/docs/man1.1.1/man1/openssl-pkcs8.html
здесь
сайте
электронной почте
здесь
Подключите
режим анализа на устройстве
здесь
Здесь
здесь
Методы и поля iOS SDK
ссылке
iOS
действий пользователя
OzAbstractMedia
ошибок
здесь
OzAbstractMedia

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

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

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

Пример:

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
          // ваш обработчик результата
  }

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

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

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

let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased)
var folderMeta: [String: Any] = ["key1": "value1"]
analysisRequest.addFolderMeta(folderMeta)
...

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

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

let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased, params: [“extract_best_shot” : true])

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

let referenceMedia = OZMedia.init(movement: .selfie,
                  mediaType: .movement,
                  metaData: ["meta":"data"],
                  videoURL: nil,
                  bestShotURL: imageUrl,
                  preferredMediaURL: nil,
                  timestamp: Date())

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

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

let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased)
analysisRequest.addFolderId(IdRequired)

Настройка iOS SDK

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

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

// параметры настройки верхней панели
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)

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

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

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

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

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

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

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

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

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

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

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

OzLivenessSDK

Синглтон (шаблон-одиночка) для Oz SDK.

clearActionVideos

Удаляет все видеоролики.

Параметры

-

Возвращает

-

createStartIntent

Создает намерение (intent) для запуска Liveness.

Параметр

Тип

Описание

actions

Список возможных действий

Возвращает

-

getErrorFromIntent

Запрашивает ошибку из намерения (intent) OnActivityResult (при наличии).

Параметр

Тип

Описание

data

Intent

Проверяемое намерение

Возвращает

Текст ошибки.

getLicensePayload

Запрашивает информацию о лицензии SDK.

Параметры

-

Возвращает

getResultFromIntent

Запрашивает медиафайлы из намерения (intent) OnActivityResult.

Параметр

Тип

Описание

data

Intent

Проверяемое намерение

Возвращает

init

Инициализирует SDK, используя данные лицензии.

Параметр

Тип

Описание

context

Context

Базовый класс Context

licenseSources

Список источников лицензий

statusListener (опционально)

StatusListener

Обработчик для проверки результата

Возвращает

-

log

Включает журналирование, запуская соответствующие механизмы Oz Liveness SDK.

Параметр

Тип

Описание

tag

String

Метка сообщения

log

String

Тело сообщения

Возвращает

-

setApiConnection

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

Параметр

Тип

Описание

connection

Тип подключения

statusListener

StatusListener<String?>

Обработчик

setEventsConnection

Подключение к серверу телеметрии.

Параметр

Тип

Описание

connection

Тип подключения

statusListener

StatusListener<String?>

Обработчик

logout

Удаляет сохраненный токен.

Параметры

-

Возвращает

-

getEventSessionId

Запрашивает идентификатор сессии телеметрии.

Параметры

-

Возвращает

Идентификатор сессии телеметрии (String).

version

Запрашивает версию SDK.

Параметры

-

Возвращает

Номер версии SDK (String).

generateSignedPayload

Создает payload с подписями медиафайлов.

Параметр

Тип

Описание

media

Массив медиафайлов

folderMeta (опционально)

[String: any]

Дополнительные метаданные папки

Возвращает

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

AnalysisRequest

Класс для выполнения проверок.

run

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

Параметр

Тип

Описание

onStatusChange

,

Callback-функция:

onStatusChange(status: AnalysisRequest.AnalysisStatus) { handleStatus() }

onError

Callback-функция:

onError(error: OzException) { handleError() }

Вызывается в случае ошибки.

onSuccess

Callback-функция:

onSuccess(result: RequestResult) {

handleResults() }

class Builder

Конструктор для AnalysisRequest.

build

Создает AnalysisRequest.

Параметры

-

Возвращает

Экземпляр класса AnalysisRequest.

addAnalysis

Добавляет в запрос анализ.

Параметр

Тип

Описание

analysis

Структура с данными об анализе

Возвращает

Ошибку в случае ее появления.

addAnalyses

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

Параметр

Тип

Описание

analysis

Массив структур Analysis

Возвращает

Ошибку в случае ее появления.

addFolderMeta

Добавляет метаданные в создаваемую папку (только для анализа на сервере).

Параметр

Тип

Описание

key

String

Ключ

value

String

Значение

Возвращает

Ошибку в случае ее появления.

uploadMedia

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

Параметр

Тип

Описание

mediaList

Объект или массив объектов OzAbstractMedia

Возвращает

Ошибку в случае ее появления.

setFolderId

Устанавливает идентификатор для ранее созданной папки. Эта папка должна существовать на сервере, иначе создастся новая.

Параметр

Тип

Описание

folderID

String

Идентификатор папки

Возвращает

Ошибку в случае ее появления.

OzConfig

Конфигурация OzLivenessSDK (используйте OzLivenessSDK.config).

setSelfieLength

Устанавливает длительность жеста Селфи (в миллисекундах).

Параметр

Тип

Описание

selfieLength

Int

Длительность жеста Селфи (в миллисекундах). Должна быть в пределах 500-5000, по умолчанию – 700

Возвращает

Ошибку в случае ее появления.

allowDebugVisualization

Возможность отображать дополнительную отладочную информацию при нажатии на текст версии.

Параметр

Тип

Описание

allowDebugVisualization

Boolean

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

attemptSettings

Количество попыток выполнить анализы, после которого SDK выдаст ошибку.

Параметр

Тип

Описание

attemptsSettings

Количество попыток

baseURL

URL сервера API для работы с телеметрией.

Параметр

Тип

Описание

baseURL

String

Адрес сервера

faceAlignmentTimeout

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

Параметр

Тип

Описание

faceAlignmentTimeout

Long

Значение тайм-аута

uploadMediaSettings

Настройки повторной отправки медиафайлов.

Parameter

Type

Description

uploadMediaSettings

Устанавливает количество попыток и интервал между ними

livenessErrorCallback

Интерфейс для обработки ошибок.

Параметр

Тип

Описание

livenessErrorCallback

ErrorHandler

Callback для обработки ошибок

localizationCode

Локализация текста.

Параметр

Тип

Описание

localizationCode

Код языка SDK

logging

Настройки журналирования.

Параметр

Тип

Описание

logging

Настройки журналирования

useMainCamera

Включает использование основной (задней) камеры для съемки вместо фронтальной.

Параметр

Тип

Описание

useMainCamera

Boolean

True – используется основная камера,

False – фронтальная

disableFramesCountValidation

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

Параметр

Тип

Описание

disableFramesCountValidation

Boolean

True – опция отключена,

False – опция включена

UICustomization

Настройки кастомизации OzLivenessSDK (используйте OzLivenessSDK.config.customization).

hideStatusBar

Скрывает системные части экрана: полосу статуса и кнопки. По умолчанию имеет значение True.

toolbarCustomization

Настройки кастомизации верхней панели.

Параметр

Тип

Описание

closeIconRes

Int (@DrawableRes)

Иконка кнопки закрытия

closeIconTint

Цвет кнопки закрытия

titleTextFont

Int (@FontRes)

Шрифт текста на верхней панели

titleTextFontStyle

Int (значения из android.graphics.Typeface, например Typeface.BOLD)

Стиль шрифта текста на верхней панели

titleTextSize

Int

Размер текста на верхней панели (в sp, 12-18)

titleTextAlpha

Int

Непрозрачность текста на верхней панели (в %, 0-100)

titleTextColor

Цвет текста на верхней панели

backgroundColor

Цвет фона верхней панели

backgroundAlpha

Int

Непрозрачность фона верхней панели (в %, 0-100)

isTitleCentered

Boolean

Центрирует текст на верхней панели

title

String

Текст на верхней панели

centerHintCustomization

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

Параметр

Тип

Описание

textFont

String

Шрифт текста подсказки

textStyle

Int (значения из android.graphics.Typeface, например Typeface.BOLD)

Стиль текста подсказки

textSize

Int

Размер шрифта текста подсказки (в sp, 12-34)

textColor

Цвет текста подсказки

textAlpha

Int

Непрозрачность текста подсказки (в %, 0-100)

verticalPosition

Int

Положение подсказки по вертикали (от нижнего края экрана, в %, 0-100)

backgroundColor

Цвет фона

backgroundOpacity

Int

Непрозрачность фона

backgroundCornerRadius

Int

Радиус скругления углов рамки фона (в dp, 0-20)

hintAnimation

Настройки кастомизации для анимации подсказки.

Параметр

Тип

Описание

hintGradientColor

Цвет градиента

hintGradientOpacity

Int

Непрозрачность градиента

animationIconSize

Int

Размер квадрата, в который вписан значок анимации

hideAnimation

Boolean

Настройки скрытия анимации, при значении True анимация скрывается

faceFrameCustomization

Настройки кастомизации рамки вокруг лица.

Параметр

Тип

Описание

geometryType

Форма рамки (oval, rectangle, circle или square)

cornerRadius

Int

Угловой радиус прямоугольника (в dp, 0-20)

strokeDefaultColor

Цвет рамки, когда лицо не в кадре

strokeFaceInFrameColor

Цвет рамки, когда лицо в кадре

strokeAlpha

Int

Непрозрачность рамки (в %, 0-100)

strokeWidth

Int

Толщина линии (в dp, 0-20)

strokePadding

Int

Отступ от рамки до овала, куда нужно поместить лицо (в dp, 0-10)

backgroundCustomization

Настройки кастомизации фона за рамкой.

Параметр

Тип

Описание

backgroundColor

Цвет фона

backgroundAlpha

Int

Непрозрачность фона (в %, 0-100)

versionTextCustomization

Настройки кастомизации текста версии SDK.

Параметр

Тип

Описание

textFont

Int (@FontRes)

Шрифт текста версии SDK

textSize

Int

SDK version text size (в sp, 12-16)

textColor

Цвет текста версии SDK

textAlpha

Int

Непрозрачность текста версии SDK (в %, 20-100)

antiscamCustomization

Настройки кастомизации для защиты от мошенничества (сообщение о том, что идет запись).

Параметр

Тип

Описание

textMessage

String

Текст сообщения

textFont

String

Шрифт текста сообщения

textSize

Int

Размер шрифта сообщения (в px, 12-18)

textColor

Цвет текста сообщения

textAlpha

Int

Непрозрачность текста сообщения (в %, 0-100)

backgroundColor

Цвет фона сообщения

backgroundOpacity

Int

Непрозрачность фона сообщения

cornerRadius

Int

Радиус скругления углов рамки фона (в px, 0-20)

flashColor

Цвет мигающего индикатора рядом с сообщением

logoCustomization

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

Parameter

Type

Description

image

Bitmap (@DrawableRes)

Изображение для лого

size

Size

Размер лого (в dp)

Переменные и объекты

enum OzAction

Действие, представленное на видео.

Значение

Описание

OneShot

Лучший кадр из снятого видео

Blank

Селфи с проверкой позиционирования лица

Scan

Сканирование

HeadRight

Поворот головы направо

HeadLeft

Поворот головы налево

HeadDown

Наклон головы вниз

HeadUp

Подъем головы вверх

EyeBlink

Моргание

Smile

Улыбка

class LicensePayload

Содержит расширенную информацию о параметрах лицензии.

Параметр

Тип

Описание

expires

Float

Период времени, спустя который срок действия лицензии истечет

features

Features

Особенности лицензии

appIDS

[String]

Массив идентификаторов приложений

sealed class OzAbstractMedia

Класс для снятого фото или видео, может быть:

OzDocumentPhoto

Фото документа.

Параметр

Тип

Описание

tag

Тег для фото документа

photoPath

String

Абсолютный путь к фото

additionalTags (опционально)

String

Дополнительные теги, если требуются (в том числе не из перечисления OzMediaTag)

metaData

Map<String, String>

Метаданные медиафайла

OzShotSet

Набор кадров (shot set) в архиве.

Параметр

Тип

Описание

tag

Тег для shot set

archivePath

String

Путь к архиву

additionalTags (опционально)

String

Дополнительные теги, если требуются (в том числе не из перечисления OzMediaTag)

metaData

Map<String, String>

Метаданные медиафайла

OzVideo

Видео с проверкой Liveness.

Параметр

Тип

Описание

tag

Тег видео

videoPath

String

URL видео с проверкой Liveness

bestShotPath (optional)

String

URL лучшего кадра в формате PNG

preferredMediaPath (optional)

String

URL медиаконтейнера API

additionalTags (опционально)

String

Дополнительные теги, если требуются (в том числе не из перечисления OzMediaTag)

metaData

Map<String, String>

Метаданные медиафайлам

enum OzMediaTag

Тег в соответствии с жестом на видео.

Значение

Описание

Blank

Видео без определенного жеста

PhotoSelfie

Селфи-фото

VideoSelfieOneShot

Видео с извлекаемым лучшим кадром

VideoSelfieScan

Видео с жестом «сканирование»

VideoSelfieEyes

Видео с жестом «моргание»

VideoSelfieSmile

Видео с жестом «улыбка»

VideoSelfieHigh

Видео с жестом «подъем головы наверх»

VideoSelfieDown

Видео с жестом «наклон головы вниз»

VideoSelfieRight

Видео с жестом «поворот головы направо»

VideoSelfieLeft

Видео с жестом «поворот головы налево»

PhotoIdPortrait

Фото, извлеченное из документа

PhotoIdBack

Фото оборотной стороны документа

PhotoIdFront

Фото лицевой стороны документа

sealed class LicenseSource

Класс для хранения лицензии, может быть:

LicenseAssetId

Содержит идентификатор лицензии.

Параметр

Тип

Описание

id

Int

Идентификатор лицензии

LicenseFilePath

Содержит путь к лицензии.

Параметр

Тип

Описание

path

String

Абсолютный путь к лицензии

class AnalysisStatus

Класс для статуса анализа, может быть:

RunningAnalysis

Статус означает, что анализы запущены.

Параметр

Тип

Описание

analysis

Информация о том, какие анализы и к каким медиафайлам применять.

UploadingMedia

Статус означает, что в настоящее время загружаются медиафайлы.

Параметр

Тип

Описание

media

Объект, который загружается в данный момент

index

Int

Номер объекта в списке

from

Int

Количество объектов

percentage

Int

Процент завершения

enum Type

Тип анализа.

Значение

Описание

BIOMETRY

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

QUALITY

Проверяет наличие живого человека в кадре

DOCUMENTS

Определяет наличие документа в кадре и проверяет корректность полей документа согласно его типу.

В настоящее время для типа DOCUMENTS режим ON_DEVICE не поддерживается.

enum Mode

Режим анализа.

Значение

Описание

ON_DEVICE

Анализ на устройстве

SERVER_BASED

Анализ на сервере

HYBRID

Гибридный анализ для Liveness: если итоговая оценка анализа на устройстве больше определенного порога, медиафайл дополнительно анализируется на сервере

class Analysis

Содержит информацию о том, какие анализы и к каким медиафайлам применять.

Параметр

Тип

Описание

type

Тип анализа

mode

Режим анализа

mediaList

Массив объектов OzAbstractMedia

params (опционально)

Map<String, Any>

Дополнительные параметры

sizeReductionStrategy

Определяет размер файла, отправляемого на сервер после успешного завершения проверки на устройстве в составе гибридного анализа

enum Resolution

Сводный статус по выполненным анализам.

Значение

Описание

FAILED

Один или более анализов не удалось завершить из-за ошибок

DECLINED

Проверка не пройдена (лица не совпадают или замечена спуфинг-атака)

SUCCESS

Проверка успешно пройдена

OPERATOR_REQUIRED

Результат анализов должен быть дополнительно перепроверен оператором

class OzAttemptsSettings

Количество попыток выполнения анализов, после которого SDK выдаст ошибку.

Параметр

Тип

Описание

singleCount

Int

Количество попыток для одного действия/жеста

commonCount

Int

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

enum OzLocalizationCode

Значение

Описание

EN

Английский

RU

Русский

HY

Армянский

KK

Казахский

KY

Кыргызский

TR

Турецкий

ES

Испанский

PT-BR

Португальский

class OzLogging

Настройки журналирования.

Параметр

Тип

Описание

allowDefaultLogging

Boolean

Включает запись в LogCat

allowFileLogging

Boolean

Включает запись в файл

journalObserver

StatusListener

Обработчик для получения событий на стороне приложения

sealed class Color

Настройки цвета, в зависимости от принимаемого значения могут быть:

ColorRes

Параметр

Тип

Описание

resId

Int

Ссылка на цвет в системе ресурсов Android

ColorHex

Параметр

Тип

Описание

hex

String

Цвет в формате HEX (например #FFFFFF)

ColorInt

Параметр

Тип

Описание

color

Int

Int-значение цвета в Android

enum GeometryType

Форма рамки.

Значение

Описание

Oval

Овал

Rectangle

Прямоугольник

Circle

Круг

Square

Квадрат

class AnalysisError

Класс для описания ошибок.

Параметр

Тип

Описание

apiErrorCode

Int

Код ошибки

message

String

Сообщение

class SourceMedia

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

Параметр

Тип

Описание

mediaId

String

Идентификатор медиафайла

mediaType

String

Тип медиа

originalName

String

Первоначальное название файла

ozMedia

Медиафайл

tags

List<String>

Теги файла

class ResultMedia

Описывает результат анализа для одного медиафайла.

Параметр

Тип

Описание

confidenceScore

Float

Итоговая оценка

isOnDevice

Boolean

Режим анализа

resolution

Общий результат анализа

sourceMedia

Анализируемый медиафайл

type

Тип анализа

class RequestResult

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

Параметр

Тип

Описание

analysisResults

Результат анализа

folderId

String

Идентификатор

resolution

Общий результат анализа

class AnalysisResult

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

Параметр

Тип

Описание

resolution

Общий результат анализа

type

Тип анализа

mode

Режим анализа

resultMedia

Список результатов отдельных анализов

confidenceScore

Float

Итоговая оценка

analysisId

String

Идентификатор анализа

params

@RawValue Map<String, Any>

Дополнительные параметры папки

error

Ошибка

serverRawResponse

String

Ответ сервера

class OzConnection

Определяет метод авторизации.

OzConnection.fromServiceToken

Авторизация по токену.

Параметр

Тип

Описание

host

String

Адрес сервера API

token

String

Токен доступа

OzConnection.fromCredentials

Авторизация по логину и паролю.

Параметр

Тип

Описание

host

String

Адрес сервера API

username

String

Логин

password

String

Пароль

class OzUploadMediaSettings

Настройки повторной отправки медиафайлов.

Параметр

Тип

Описание

attemptsCount

Int

Количество попыток отправки медиафайлов

attemptsTimeout

Int

Интервал времени между попытками

enum SizeReductionStrategy

Определяет размер файла, отправляемого на сервер после успешного завершения проверки на устройстве в составе гибридного анализа. По умолчанию отправляется сжатое видео.

Значение

Описание

UPLOAD_ORIGINAL

Исходное видео

UPLOAD_COMPRESSED

Сжатое видео

UPLOAD_BEST_SHOT

Полученный из видео лучший кадр

UPLOAD_NOTHING

Ничего (в этом случае на сервер не отправляется ничего, папка не создается)

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

Код ошибки

Сообщение

Описание

ERROR = 3

Error.

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

ATTEMPTS_EXHAUSTED_ERROR = 4

Error. Attempts exhausted for liveness action.

VIDEO_RECORD_ERROR = 5

Error by video record.

Ошибка записи видео

NO_ACTIONS_ERROR = 6

Error. OzLivenessSDK started without actions.

FORCE_CLOSED = 7

Error. Liveness activity is force closed from client application.

Клиент закрыл экран Liveness во время работы

DEVICE_HAS_NO_FRONT_CAMERA = 8

Error. Device has not front camera.

Фронтальная камера на устройстве не найдена

DEVICE_HAS_NO_MAIN_CAMERA = 9

Error. Device has not main camera.

Задняя (основная) камера на устройстве не найдена

DEVICE_CAMERA_CONFIGURATION_NOT_SUPPORTED = 10

Error. Device camera configuration is not supported.

Liveness не поддерживает конфигурацию камеры на устройстве

FACE_ALIGNMENT_TIMEOUT = 12

Error. Face alignment timeout in OzLivenessSDK.config.faceAlignmentTimeout milliseconds

Время подготовки, выделенное на съемку, истекло

ERROR = 13

The check was interrupted by user

Пользователь закрыл экран Liveness во время проверки

Установка и использование плагина для Flutter

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

Добавьте строки из блока ниже в pubspec.yaml проекта, где планируется использовать плагин.

  ozsdk:
    git:
      url: https://gitlab.com/oz-forensics/oz-mobile-flutter-plugin.git
      ref: '8.8.2'

Поместите файл лицензии (например, license.json или forensics.license) в папку Flutter application/assets. В pubspec.yaml добавьте asset:

assets
  - assets/license.json // название файла лицензии должно совпадать с названием из папки assets

Для Android укажите путь к репозиторию Oz в /android/build.gradle, раздел allprojects → repositories:

allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url ‘https://ozforensics.jfrog.io/artifactory/main’ } // ссылка на репозиторий
    }
}

Для Flutter 8.24.0 и новее или Android Gradle plugin 8.0.0 и новее добавьте строку в android/gradle.properties:

android.nonTransitiveRClass=false

Минимальная версия SDK – 21 или выше:

defaultConfig {
  ...
  minSDKVersion 21
  ...
}

Для iOS в Runner → Info → Deployment target → iOS Deployment Target установите версию 13 или выше.

В ios/Podfile закомментируйте строку use_frameworks! (#use_frameworks!).

Начало работы с Flutter

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

Для инициализации вызовите метод init. Название и путь к файлу лицензии должны совпадать с теми, которые вы указали в pubspec.yaml (например, assets/license.json).

await OZSDK.initSDK([<% название файла лицензии и путь к нему %>]);

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

Для подключения используйте полученные от нас логин, пароль и адрес API сервера.

await OZSDK.setApiConnectionWithCredentials(<login>, <password>, <host>);

На стадии коммерческого использования вместо логина и пароля мы рекомендуем использовать токен доступа, который можно получить с помощью метода API /api/authorize/auth.

 await OZSDK.setApiConnectionWithToken(token, host);
await OZSDK.setEventConnectionWithCredentials(<login>, <password>, <host>);

или

await OZSDK.setEventConnectionWithToken(<token>, <host>);

Съемка видео

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

await OZSDK.startLiveness(<actions>, <use_main_camera>);

Параметр

Тип

Описание

actions

List<VerificationAction>

Действия на видео

use_main_camera

Boolean

Если установлено True, используется основная камера, False – передняя

Обратите внимание: для версий до 8.11 включительно метод для запуска называется executeLiveness. Он возвращает результат съемки.

Для получения результата съемки в версии 8.12 и новее подпишитесь на livenessResult, как показано ниже:

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();
  }
}

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

Размещенный ниже код поможет вам запустить анализы.

Создайте объект Analysis:

List<Analysis> analysis = [ Analysis(Type.quality, Mode.serverBased, <media>, {}), ];

Запустите созданный анализ:

final analysisResult = await OZSDK.analyze(analysis, [], {}) ?? [];

Результат анализа запишется в массив объектов analysisResult.

Для анализа медиафайла, полученного не нашим SDK, используйте следующий код:

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, [], {});

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

Журнал изменений для iOS.

8.16.2 – 22.04.2025

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

8.16.1 – 09.04.2025

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

8.16.0 – 11.03.2025

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

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

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

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

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

8.15.0 – 30.12.2024

  • Добавлен правильный порядок фокусировки для VoiceOver при включенной антискам-подсказке.

  • Добавлена ​​публичная настройка extract_action_shot в Демо Приложении.

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

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

8.14.0 – 03.12.2024

  • Обновления доступности для пользователей с инвалидностью согласно требованиям WCAG: можно настроить озвучивание подсказок SDK и элементов управления.

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

  • Исправили незначительные ошибки.

  • Обновления телеметрии.

8.13.0 – 11.11.2024

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

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

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

8.12.2 – 24.10.2024

  • Улучшили работу SDK.

8.12.1 – 30.09.2024

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

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

8.11.0 – 10.09.2024

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

8.10.1 – 23.08.2024

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

8.10.0 – 01.08.2024

  • Для работы SDK теперь нужен Xcode 15 и новее.

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

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

8.9.1 – 16.07.2024

  • Улучшили работу SDK.

8.8.3 – 11.07.2024

  • Улучшили работу SDK.

8.8.2 – 25.06.2024

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

8.8.1 – 25.06.2024

  • Обновления журналирования.

8.8.0 – 18.06.2024

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

8.7.0 – 10.05.2024

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

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

8.6.0 – 10.04.2024

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

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

8.5.0 – 06.03.2024

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

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

8.4.2 – 24.01.2024

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

8.4.0 – 09.01.2024

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

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

8.3.3 – 11.12.2023

  • Улучшили работу механизмов лицензирования.

8.3.0 – 17.11.2023

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

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

8.2.1 – 11.11.2023

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

8.2.0 – 30.10.2023

  • Добавили в структуру Analysis поле sizeReductionStrategy. Оно определяет размер файла, отправляемого на сервер после успешного завершения проверки на устройстве в составе гибридного анализа.

  • Сообщения для получаемых из API ошибок теперь более информативны.

  • Настройка toFrameGradientColor для кастомизации подсказки hintAnimationCustomization больше не используется. Вместо нее используйте hintGradientColor.

  • Вернули поддержку iOS 11.

8.1.1 – 09.10.2023

8.1.0 – 07.09.2023

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

  • Добавили португальский язык (бразильский вариант).

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

  • Добавили новый метод для получения идентификатора телеметрии (логирования): getEventSessionId.

  • Методы setPermanentAccessToken, configure и login больше не используются. Вместо них, пожалуйста, используйте метод setApiConnection.

  • Метод setLicense(from path:String) больше не используется. Вместо него, пожалуйста, используйте метод setLicense(licenseSource: LicenseSource).

  • Исправили ошибки и улучшили работу SDK.

8.0.2 – 15.08.2023

  • Исправили ошибки, улучшили работу алгоритмов SDK.

8.0.0 – 27.06.2023

  • Добавлен новый тип анализа – гибридный (сейчас работает только для Liveness). В случае спорных результатов анализа на устройстве проводится дополнительная проверка на сервере.

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

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

  • Добавили новые структуры RequestStatus (статус анализа), ResultMedia (статус анализов для одного медиафайла) и RequestResult (сводный результат анализа для всех медиа).

  • Структура OzAnalysisResult больше не используется; вместо нее – обновленная структура AnalysisResult.

  • Для объекта OZMedia теперь можно добавить дополнительные теги не из списка основных.

  • Длительность видео для жеста “Селфи” снижена до 0,7 секунд, соответственно, уменьшились размер файла и время его загрузки на сервер.

  • Текст подсказки теперь может выходить за границы рамки для лица по горизонтали (для основной камеры).

  • Прекращена поддержка методов:

Удаленный метод

Замена

analyse

AnalysisRequest.run

addToFolder

uploadMedia

documentAnalyse

AnalysisRequest.run

uploadAndAnalyse

AnalysisRequest.run

runOnDeviceBiometryAnalysis

AnalysisRequest.run

runOnDeviceLivenessAnalysis

AnalysisRequest.run

addMedia

uploadMedia

7.3.0 – 06.06.2023

  • Добавили настройки для фона подсказки.

  • Добавили новые формы рамки (круг, квадрат).

  • Добавили виджет для защиты от мошенничества и набор настроек к нему. С помощью этого виджета вы можете уведомлять пользователей, что ведется съемка видео для, например, отправления заявки на кредит. Таким образом вы сможете защитить пользователей, если мошенники попытаются убедить их подтвердить такой запрос.

  • Синхронизировали значения настроек кастомизации по умолчанию с Android.

  • Добавили испанский язык.

  • iOS 11 больше не поддерживается; минимальная необходимая версия – 12.

7.2.1 – 24.05.2023

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

7.2.0 – 18.05.2023

  • Улучшили работу алгоритмов SDK.

7.1.6 – 04.05.2023

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

7.1.5 – 03.04.2023

  • Улучшили работу Liveness-анализов на устройстве.

7.1.4 – 24.03.2023

  • Обновили анимацию для солнечных очков / маски.

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

7.1.2 – 21.02.2023

  • Обновили версию TensorFlow до 2.11.

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

7.1.1 – 06.02.2023

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

7.1.0 – 20.01.2023

  • Обновили модель для выполнения анализов.

  • Добавили метод uploadMedia в AnalysisRequest. Метод addMedia больше не используется.

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

  • Добавили кнопку для сброса настроек языка и темы SDK.

  • Увеличили тайм-аут сетевых запросов до 90 с.

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

  • Исправили баги.

7.0.0 – 08.12.2022

6.7.0

6.4.0

  • Синхронизировали нумерацию версий с Android SDK.

  • Добавили новое поле params в структуру Analysis – с его помощью можно задавать дополнительные параметры, например, для извлечения на сервере лучшего кадра. Алгоритм "лучший кадр" выбирает из видеозаписи наиболее качественный и удачный кадр с лицом.

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

  • Поменяли жест Комбо.

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

3.0.1

  • Жесты отдаления и приближения больше не поддерживаются.

3.0.0

  • Добавили новую упрощенную структуру анализа AnalysisRequest.

2.3.0

  • Добавили методы для локального анализа: runOnDeviceLivenessAnalysis и runOnDeviceBiometryAnalysis.

  • Версию для установки можно выбрать: стандартная установка дает доступ ко всем функциям, а в версии core (OzLivenessSDK/Core) отсутствует возможность делать анализы локально на устройстве.

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

  • Дополнили процесс лицензирования: теперь лицензию можно указать при инициализации SDK. Воспользуйтесь методом OZSDK(licenseSources: [LicenseSource], completion: @escaping ((LicenseData?, LicenseError?) -> Void)), где LicenseSource – путь до лицензии, LicenseData – информация о лицензии.

  • Добавили метод setLicense для принудительной установки лицензии.

2.2.3

  • Добавили турецкий язык.

2.2.1

  • Добавили киргизский язык.

  • Добавили Completion Handler для результатов анализа.

  • Добавили в телеметрию передачу Error User Info, теперь можно узнавать подробности об ошибке, которая происходит в работе анализа.

2.2.0

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

  • Добавили рамки для лица, теперь их две – овал и прямоугольник.

  • Теперь поддерживаем Xcode 12.5.1+.

2.1.4

  • Добавили конфигурацию SDK через лицензии.

2.1.3

  • Добавили жест One Shot.

  • В OZVerificationResult добавили bestShotURL (содержит изображение лучшего кадра) и preferredMediaURL (содержит медиаконтейнер с url лучшего видео для назначения анализа)

  • При запуске локальной проверки теперь можно указать тип камеры: front / back.

2.1.2

  • Авторизационные сессии теперь пролонгируются автоматически.

  • Обновили интерфейсы авторизации.

2.1.1

  • Добавили казахский язык.

  • Добавили тексты для ошибок лицензирования.

2.1.0

  • Сетевые запросы теперь можно отменить.

  • Для лицензии можно указать Bundle.

  • Добавили параметризации анализов documentAnalyse.

  • Исправили ошибки при сборках проекта. (Xcode 12.4 / Cocoapods 1.10.1).

2.0.0

  • Добавили поддержку лицензий.

  • Теперь поддерживаем Xcode 12. 11 поддерживать перестали.

  • Исправили ошибку documentAnalyse – анализы не назначались без указания analyseStates. Теперь все корректно.

  • Поправили ошибки в сборе логов.

Oz Liveness Web SDK

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

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

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

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

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

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

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

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

Safe

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

Status

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

Folder

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

Full

В случае, когда result_mode установлен на full, вернется полная информация об анализах:

  • все, что вы могли видеть при значении folder;

  • временные метки;

  • метаданные;

  • идентификаторы анализов, компании, группы анализов;

  • пороги;

  • информация о медиафайлах;

  • и так далее.

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

OZSDK

Синглтон (шаблон-одиночка) для Oz SDK.

Методы

OZSDK

Возвращает

-

setLicense

Принудительно устанавливает лицензию.

setApiConnection

Запрашивает токен доступа для пользователя.

Возвращает

Токен доступа или ошибку.

setEventsConnection

Запрашивает токен доступа для отправки телеметрии.

Возвращает

Токен доступа или ошибку.

isLoggedIn

Проверяет, существует ли токен доступа.

Параметры

-

Возвращает

Результат проверки – true или false.

logout

Удаляет сохраненный токен доступа.

Параметры

-

Возвращает

-

createVerificationVCWithDelegate

Создает контроллер для проверки Liveness.

Возвращает

UIViewController или исключение.

createVerificationVC

Создает контроллер для проверки Liveness.

Возвращает

UIViewController или исключение.

cleanTempDirectory

Удаляет все видеоролики.

Параметры

-

Возвращает

-

getEventSessionId

Запрашивает идентификатор сессии телеметрии.

Параметры

-

Возвращает

Идентификатор сессии телеметрии (String).

set

Устанавливает кастомный бандл, в котором содержатся переводы строк.

Возвращает

-

setSelfieLength

Устанавливает длительность жеста Селфи (в миллисекундах).

generateSignedPayload

Создает payload с подписями медиафайлов.

Возвращает

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

Поля

localizationCode

Язык SDK (если язык не указывается, локаль устанавливается автоматически).

host

Хост, к которому обращается система для проверки Liveness.

attemptSettings

Количество попыток выполнения анализов, после которого SDK выдаст ошибку.

version

Версия SDK.

OZLivenessDelegate

Делегат OZSDK.

Методы

onOZLivenessResult

Запрашивает результаты проверки Liveness.

Возвращает

-

onError

Обрабатывает ошибки.

Возвращает

-

AnalysisRequest

Протокол для выполнения проверок.

Методы

AnalysisRequestBuilder

Создает инстанс AnalysisRequest.

Возвращает

Инстанс AnalysisRequest.

addAnalysis

Добавляет в AnalysisRequest анализы.

Возвращает

-

uploadMedia

Загружает медиафайл(ы) на сервер.

Возвращает

-

addFolderId

Добавляет идентификатор папки для загрузки на сервер.

Возвращает

-

addFolderMeta

Добавляет в папку метаданные.

Возвращает

-

run

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

Возвращает

Результат проверок или ошибку.

Customization

Настройки кастомизации OzLivenessSDK (используйте OZSDK.customization).

toolbarCustomization

Настройки кастомизации верхней панели.

centerHintCustomization

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

hintAnimationCustomization

Настройки кастомизации для анимации подсказки.

faceFrameCustomization

Настройки кастомизации рамки вокруг лица.

backgroundCustomization

Настройки кастомизации фона за рамкой.

versionCustomization

Настройки кастомизации текста версии SDK.

antiscamCustomization

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

logoCustomization

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

Переменные и объекты

enum LicenseSource

Источник лицензии.

struct LicenseData

Полная информация о лицензии

enum OzVerificationMovement

Действие, представленное на видео.

enum OZLocalizationCode

struct OZMedia

Содержит информацию о медиафайле.

enum MediaType

Тип медиафайла.

enum OZVerificationStatus

Описание не актуально (deprecated) и будет удалено в будущих релизах.

struct Analysis

Содержит информацию о том, какие анализы и к каким медиафайлам применять.

enum AnalysisType

Тип анализа.

В настоящее время для типа DOCUMENTS режим onDevice не поддерживается.

enum AnalysisMode

Режим анализа.

enum ScenarioState

Отображает статус обработки медиафайлов.

struct AnalysisStatus

Отображает статус загрузки файлов.

RequestStatus

Отображает промежуточный результат обработки анализов.

ResultMedia

Описывает результат анализа для одного медиафайла.

RequestResult

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

class AnalysisResult

Содержит результат проверок.

enum AnalyseResolutionStatus

Сводный статус по выполненным анализам.

struct AnalyseResolution

Содержит результаты одиночных анализов.

enum GeometryType

Форма рамки.

enum LicenseError

Возможные ошибки лицензирования.

enum Connection

Тип авторизации.

struct UploadMediaSettings

Настройки повторной отправки медиафайлов.

enum SizeReductionStrategy

Определяет размер файла, отправляемого на сервер после успешного завершения проверки на устройстве в составе гибридного анализа. По умолчанию отправляется сжатое видео.

Flutter

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

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

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

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

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

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

  • Xcode.

Web Plugin

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

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

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

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

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

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

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

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

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

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

Съемка видео и описание коллбэка on_capture_complete

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

1. Обзор

Режим capture работает следующим образом:

1. Oz Web SDK снимает видео и передает его вашему web-приложению в виде последовательности кадров.

2. Web-приложение вызывает ваш бэкэнд и передает в него архив с кадрами.

3. После обработки видео ваш бэкэнд вызывает Oz API для выполнения анализов, после чего получает их результаты.

4. Ваш бэкэнд передает результаты обратно в web-приложение (опционально).

2. Реализация

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

Виртуальная камера не обнаружена

Виртуальная камера обнаружена

Список переменных с их значениями приведен ниже.

Обратите внимание:

  • Вы можете получить из папки видео в формате MP4 video: вызовите метод /api/folders/{{folder_id}}, указав идентификатор папки. В JSON-ответе найдите preview_url в source_media. В preview_url содержится ссылка на видео. Из плагина получить MP4-видео нельзя (только в виде последовательности кадров).

  • При использовании архитектуры capture также необходимо добавить в запрос POST {{host}}/api/folders дополнительное поле additional_info. Оно нужно для сбора информации о среде клиента. Пример заполнения тела запроса:

  • Для передачи в Oz API используйте данные без кодирования в base64.

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

Safe

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

или

Status

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

или

Folder

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

Full

В случае, когда result_mode установлен на full, вернется:

  • полная информация об анализах:

    • все, что вы могли видеть при значении folder;

    • временные метки;

    • метаданные;

    • идентификаторы анализов, компании, группы анализов;

    • пороги;

    • информация о медиафайлах;

    • и так далее.

Oz API

Описание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как сравнить лицо из снятого для проверки Liveness видео с лицом из вашей базы данных

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

К этому моменту вы, скорее всего, уже разобрались с тем, как снимать видео и проводить Liveness-проверки. Если нет, пожалуйста, ознакомьтесь со статьями:

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

1. Получите идентификатор папки, где находится нужное видео –folder_id

Сравнение лиц должно происходить в одной папке, поэтому вам необходим идентификатор папки, где лежит нужное вам Liveness-видео. Получите идентификатор папки, как показано ниже, и передайте его на свой бэкенд.

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

Android:

iOS:

2. Загрузите в папку референтное фото из своей базы данных

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

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

4. Запустите опрос для получения результатов

  • качественные – в resolution (SUCCESS или DECLINED).

  • количественные – в analyses.results_data.min_confidence

Коллекция Postman для описанных в статье шагов.

Как добавить съемку документа и возможность сопоставления лиц в ваше веб- или мобильное приложение

Пожалуйста, обратите внимание: в мобильных SDK Oz отсутствует интерфейс для съемки документов. Для этого вам потребуется ПО стороннего производителя или ваше собственное. В Web SDK возможность съемки документа есть.

Ниже описаны шаги, которые потребуется пройти для добавления сравнения лиц к Liveness-проверке.

К этому моменту вы, скорее всего, уже разобрались с тем, как снимать видео и проводить Liveness-проверки. Если нет, пожалуйста, ознакомьтесь со статьями:

Добавление съемки документа в Web SDK

Добавьте photo_id_front в список действий для плагина.

Добавление сравнения лиц в Android SDK

Внимание: в данном случае мы предполагаем, что фотография (например, документа) хранится на устройстве под названием reference.jpg.

Измените код, запускающий анализ:

Для анализа на устройстве вместо Analysis.Mode.SERVER_BASED укажите Analysis.Mode.ON_DEVICE.

Добавление сравнения лиц в iOS SDK

Внимание: в данном случае мы предполагаем, что фотография (например, документа) хранится на устройстве под названием reference.jpg.

Измените код, запускающий анализ:

Для анализа на устройстве вместо .serverBased укажите .onDevice.

Для всех SDK

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

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

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

Полную информацию о лицензии – объект .

Массив объектов .

[]

Вызывается при изменении статуса AnalysisRequest. Текущий статус отображается в .

Вызывается по завершении анализов. В качестве результата передается объект .

[]

[]

​​

​

​​

​​

​​

​​

​​

[]

Код языка SDK в соответствии с .

List<>

List<>

Превышено количество

на видео не найдены

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

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

Добавили .

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

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

Обновили код в .

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

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

Вы теперь можете добавить язык или изменить текущие переводы самостоятельно. Как это сделать, описано .

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

Синхронизировали ответы методов run с Android SDK, теперь метод возвращает .

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

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

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

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

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

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

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

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

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

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

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

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

Код языка SDK в соответствии с .

Параметр
Тип
Описание

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

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

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

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

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

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

На стороне сервера необходимо сконфигурировать Web SDK для работы в режиме capture: параметру architecture в файле app_config.json значение capture.

В вашем web-приложении добавьте callback-функцию для обработки кадров при открытии Web SDK:

Видео, полученное через Oz Web SDK, – это последовательность кадров. Чтобы отправить его Oz API, поместите кадры в ZIP-архив, затем используйте метод POST {{host}}/api/folders (пройдите по для ознакомления с коллекцией Postman).

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

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

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

пока анализ выполняется – ответ, аналогичный ответу при (в процессе обработки), или

проводит и

1. Авторизуйтесь. Параметры передаются в json-запросе в составе credentials. См. статьи и .

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

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

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

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

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

Для видео, записанного через Web SDK, процесс получения идентификатора папки описан .

Вызовите POST /api/folders/{{folder_id}}/media/. Замените folder_id на полученный на предыдущем шаге идентификатор папки. Так ваше изображение попадет в папку с нужным видео.

Для запуска анализа вызовите POST /api/folders/{{folder_id}}/analyses/. Замените folder_id на полученный ранее идентификатор папки. В теле запроса укажите анализ BIOMETRY.

Раз в секунду отправляйте GET /api/analyses/{{analyse_id}} с полученным ранее analyse_id, пока состояние анализа не изменится с PROCESSING на какое-либо другое. Когда анализ завершится, вы можете оценить результаты:

Эти шаги помогут вам провести сравнение лиц с использованием Oz API. Чтобы получить доступ к снятым видео и результатам анализов, воспользуйтесь или API-запросами.

Детальную информацию о том, как применять инструменты Oz API, вы можете найти в .

Код образца для Android находится .

Код образца для iOS находится .

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

Методы как API, так и SDK могут гибко комбинироваться. Подробнее об этом вы можете прочитать в .

Типы анализов
ISO 639-1
здесь
образец кода для SwiftUI
Readme.md
здесь
список настроек кастомизации SDK
здесь
здесь
Angular
React
Oz Liveness Web Plugin
Oz Liveness Web Adapter
Oz API
Как интегрировать серверную проверку Liveness в ваше Web-приложение
Как добавить съемку документа и возможность сопоставления лиц в ваше веб- или мобильное приложение
на ваших серверах
Свяжитесь с нами
Интегрируйте
здесь
LicensePayload
OzAbstractMedia
здесь
здесь
{
  "state": "finished"
}
{
 "state": "finished",
 "analyses": {
   "quality": {
     "state": "finished",
     "resolution": "success"
   }
 }
}
{
 "state": "finished",
 "folder_id": "your_folder_id",
 "analyses": {
   "quality": {
     "state": "finished",
     "resolution": "success"
   }
 }
}

Параметр

Тип

Описание

languageBundle

Bundle

Бандл для поиска переводов

Параметр

Тип

Описание

selfieLength

Int

Длительность жеста Селфи (в миллисекундах). Должна быть в пределах 500-5000, по умолчанию – 700

Параметр

Тип

Описание

host

String

Адрес хоста

Параметр

Тип

Описание

version

String

Номер версии

Параметр

Тип

Описание

folderId (опционально)

String

Идентификатор папки; указывается только в том случае, если нужно загрузить файлы в определенную папку

Параметр

Тип

Описание

analysis

Analysis

Структура с информацией об анализах

Параметр

Тип

Описание

folderId

String

Идентификатор папки

Параметр

Тип

Описание

meta

[String]

Массив метаданных; пример:

["meta1": "data1"]

Параметр

Тип

Описание

closeButtonIcon

UIImage

Иконка кнопки закрытия

closeButtonColor

UIColor

Цвет кнопки закрытия, tintColor

titleFont

UIFont

Шрифт текста на верхней панели

titleColor

UIColor

Цвет текста на верхней панели

backgroundColor

UIColor

Цвет фона верхней панели

titleText

String

Текст на верхней панели

Параметр

Тип

Описание

textFont

UIFont

Шрифт текста подсказки

textColor

UIColor

Цвет текста подсказки

backgroundColor

UIColor

Цвет фона текста подсказки

verticalPosition

Int

Положение подсказки по вертикали (от верхнего края экрана, в %, 0-100)

hideTextBackground

Bool

Скрывает подложку подсказки

backgroundCornerRadius

Int

Угловой радиус подложки

Параметр

Тип

Описание

hideAnimation

Bool

Переключатель для отображения анимации, значение True скрывает анимацию

animationIconSize

CGfloat

Размер стороны квадрата, в который вписана иконка анимации

hintGradientColor

UIColor

Цвет градиента у рамки

Параметр

Тип

Описание

backgroundColor

UIColor

Цвет фона за рамкой

Параметр

Тип

Описание

textFont

UIFont

Шрифт текста версии SDK

textColor

UIColor

Цвет текста версии SDK

Parameter

Type

Description

customizationEnableAntiscam

Bool

Включает защиту от мошенников

customizationAntiscamTextMessage

String

Текст сообщения

customizationAntiscamTextFont

UIFont

Шрифт текста сообщения

customizationAntiscamTextColor

UIColor

Цвет текста сообщения

customizationAntiscamBackgroundColor

UIColor

Цвет подложки сообщения

customizationAntiscamCornerRadius

CGFloat

Угловой радиус подложки

customizationAntiscamFlashColor

UIColor

Цвет мигающего индикатора рядом с сообщением

Parameter

Type

Description

image

UIImage

Изображение для лого

size

CGSize

Размер лого (в dp)

Значение

Описание

licenseFilePath

Абсолютный путь к лицензии (String)

licenseFileName

Имя файла лицензии

Параметр

Тип

Описание

appIDS

[String]

Массив идентификаторов приложений

expires

TimeInterval

Период времени, спустя который срок действия лицензии истечет

features

Features

Особенности лицензии

configs (опционально)

ABTestingConfigs

Дополнительная конфигурация

Значение

Описание

smile

Улыбка

eyes

Моргание

scanning

Сканирование

selfie

Селфи с проверкой позиционирования лица

one_shot

Лучший кадр из снятого видео

left

Поворот головы налево

right

Поворот головы направо

down

Наклон головы вниз

up

Подъем головы наверх

Значение

Описание

en

Английский

ru

Русский

hy

Армянский

kk

Казахский

ky

Кыргызский

tr

Турецкий

es

Испанский

pt-BR

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

custom(String)

Кастомный язык (код языка ISO 639-1, две буквы)

Значение

Описание

movement

Видео/фото с действием

documentBack

Фото оборотной стороны документа

documentFront

Фото лицевой стороны документа

Значение

Описание

userNotProcessed

Проверка не была обработана

failedBecauseUserCancelled

Проверка была прервана пользователем.

failedBecauseCameraPermissionDenied

Нельзя выполнить проверку из-за отсутствия доступа к камере

failedBecauseOfBackgroundMode

Нельзя выполнить проверку, так как приложение было свернуто

failedBecauseOfTimeout

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

failedBecauseOfAttemptLimit

Нельзя выполнить проверку, так как превышен лимит попыток

failedBecausePreparingTimout

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

failedBecauseOfLowMemory

Нельзя выполнить проверку, так как не хватает памяти

Значение

Описание

biometry

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

quality

Проверяет наличие живого человека в кадре

document

Определяет наличие документа в кадре и проверяет корректность полей документа согласно его типу.

blacklist

Сравнивает лицо снятого на фото или видео человека с лицами из заранее созданной базы медиафайлов

Значение

Описание

onDevice

Анализ на устройстве

serverBased

Анализ на сервере

hybrid

Гибридный анализ для Liveness: если итоговая оценка анализа на устройстве больше определенного порога, медиафайл дополнительно анализируется на сервере.

Значение

Описание

addToFolder

Система создает папку и помещает в нее медиафайлы

addAnalyses

Система добавляет анализы

waitAnalysisResult

Система ожидает результата

Значение

Описание

INITIAL

Анализы не назначались

PROCESSING

Анализы выполняются

FAILED

Один или более анализов не удалось завершить из-за ошибок

FINISHED

Анализы выполнены

DECLINED

Проверка не пройдена (лица не совпадают или замечена спуфинг-атака)

SUCCESS

Проверка успешно пройдена

OPERATOR_REQUIRED

Результат анализов должен быть дополнительно перепроверен оператором

Значение

Описание

oval

Овальная рамка

rectangle(cornerRadius: CGFloat)

Прямоугольная рамка (угловой радиус рамки)

circle

Круглая рамка

square(cornerRadius: CGFloat)

Квадратная рамка (угловой радиус рамки)

Case

Description

licenseFileNotFound

Лицензия не найдена

licenseParseError

Невозможно распознать файл лицензии

licenseBundleError

Указанный в лицензииbundle_id не совпадает с используемым bundle_id.

licenseExpired

Срок действия лицензии истек

Значение

Описание

fromServiceToken

Авторизация через токен:

  • host: String

  • token: String

fromCredentials

Авторизация через логин и пароль:

  • host: String

  • login: String

  • password: String

attemptsCount

Int

Количество попыток загрузки медиафайла

attemptsTimeout

Int

Интервал времени между попытками

Case

Description

uploadOriginal

Исходное видео

uploadCompressed

Сжатое видео

uploadBestShot

Полученный из видео лучший кадр

uploadNothing

Ничего (в этом случае на сервер не отправляется ничего, папка не создается)

OzMedia
здесь
менять
своим
массив результатов анализов
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);
  }
});
on_error { 
    "code": "error_code", 
    "event_session_id": "id_of_telemetry_session_with_error", 
    "message": "<error decription>", 
    "context": {}  // дополнительная информация
}
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

Информация о среде клиента

"VIDEO_FILE_KEY": VIDEO_FILE_ZIP_BINARY
"payload": "{
        "media:meta_data": {
           "VIDEO_FILE_KEY": {
              "additional_info": <additional_info>
              }
           }
}"
видео в MP4
{
 "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": ""
   }
 }
}
payload
{
  "media:tags": {
    "video1": [
      "video_selfie",
      "video_selfie_scan",
      "orientation_portrait"
    ]
  }
}
request body
{
    "analyses": [{
    "type": "collection",
    "source_media": ["идентификатор_медиафайла_источника"],
  }]
}
{    
    "resolution_endpoint": "address.com",
    {
    .... // информация о папке и т.д.
    }
}
AnalysisRequest.Builder()
        ...
        .run(object : AnalysisRequest.AnalysisListener {
            override fun onSuccess(result: List<OzAnalysisResult>) {
                // сохраните folder_id, он потребуется далее
                val folderId = result.firstOrNull()?.folderId
            }
            ...
        })
private void analyzeMedia(List<OzAbstractMedia> mediaList) {
    new AnalysisRequest.Builder()
            ...
            .run(new AnalysisRequest.AnalysisListener() {
                @Override public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) {}
                @Override
                public void onSuccess(@NonNull List<OzAnalysisResult> list) {
                    String folderId = list.get(0).getFolderId();
                    }
                }
                ...
    });
}
analysisRequest.run(
scenarioStateHandler: { state in }, 
uploadProgressHandler: { (progress) in }  
)   { (analysisResults : [OzAnalysisResult], error) in 
        // сохраните folder_id, он потребуется далее
        let folderID = analysisResults.first?.folderID
    }
}
{
  "media:tags": { 
    "photo1": [
        "photo_id", "photo_id_front" // для фото лицевой стороны документа
        // ИЛИ
        "photo_selfie" // для фото, не являющегося документом
    ]
  }
}
{
    "analyses": [
        {
            "type": "biometry"
        }
    ]
}
OzLiveness.open({
  lang: 'en',
  action: [
    'photo_id_front', 
    'video_selfie_blank'
  ],
  ...
});
private fun analyzeMedia(mediaList: List<OzAbstractMedia>) {

    val refFile = File(context.filesDir, "reference.jpg")
    val refMedia = OzAbstractMedia.OzDocumentPhoto(
        OzMediaTag.PhotoIdFront , // OzMediaTag.PhotoSelfie для не являющегося документом фото
        refFile.absolutePath
    )

    AnalysisRequest.Builder()
        .addAnalysis(Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaList))
        .addAnalysis(Analysis(Analysis.Type.BIOMETRY, Analysis.Mode.SERVER_BASED, mediaList + refMedia))
        .build()
        .run(object : AnalysisRequest.AnalysisListener {
            override fun onSuccess(result: List<OzAnalysisResult>) {
                result.forEach { 
                    println(it.resolution.name)
                    println(it.folderId)
                }
            }
            override fun onError(error: OzException) {
                error.printStackTrace()
            }
        })
} 
private void analyzeMedia(List<OzAbstractMedia> mediaList) {
    File refFile = new File(context.getFilesDir(), "reference.jpg");
    OzAbstractMedia refMedia = new OzAbstractMedia.OzDocumentPhoto(
            OzMediaTag.PhotoIdFront , // OzMediaTag.PhotoSelfie for a non-ID photo
            refFile.getAbsolutePath()
    );
    ArrayList<OzAbstractMedia> mediaWithReferencePhoto = new ArrayList<>(mediaList);
    mediaWithReferencePhoto.add(refMedia);
    new AnalysisRequest.Builder()
            .addAnalysis(new Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaList, Collections.emptyMap()))
            .addAnalysis(new Analysis(Analysis.Type.BIOMETRY, Analysis.Mode.SERVER_BASED, mediaWithReferencePhoto, Collections.emptyMap()))
            .build()
            .run(new AnalysisRequest.AnalysisListener() {
                @Override public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) {}
                @Override
                public void onSuccess(@NonNull List<OzAnalysisResult> list) {
                    String folderId = list.get(0).getFolderId();
                }
                @Override
                public void onError(@NonNull OzException e) { e.printStackTrace(); }
    });
}
let imageURL = URL(fileURLWithPath: NSTemporaryDirectory())
    .appendingPathComponent("reference.jpg")

let refMedia = OZMedia.init(movement: .selfie,
                   mediaType: .movement,
                   metaData: nil,
                   videoURL: nil,
                   bestShotURL: imageUrl,
                   preferredMediaURL: nil,
                   timestamp: Date())
   
var mediaBiometry = [OZMedia]()
mediaBiometry.append(refMedia)
mediaBiometry.append(contentsOf: mediaToAnalyze)
let analysisRequest = AnalysisRequestBuilder()
let analysisBiometry = Analysis.init(media: mediaBiometry, type: .biometry, mode: .serverBased)
let analysisQuality = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased)
analysisRequest.addAnalysis(analysisBiometry)
analysisRequest.addAnalysis(analysisQuality)
analysisRequest.uploadMedia(mediaBiometry)
analysisRequest.run(
    scenarioStateHandler: { state in }, // обработчик шагов сценария
    uploadProgressHandler: { (progress) in } // обработчик для загрузки файлов
) { (analysisResults : [OzAnalysisResult], error) in
    // получение и обработка анализов
    for result in analysisResults {
        print(result.resolution)
        print(result.folderID)
    }
}

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

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

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

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

56

Mozilla Firefox

55

Safari

11

Microsoft Edge*

17

Opera

47

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

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

Для настройки интерфейса воспользуйтесь разделом style в методе Ozliveness.open. Полный список настроек приведен после примера.

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

OzLiveness.open({
style: {
    baseColorCustomization: {
        textColorPrimary: "#000000",
        backgroundColorPrimary: "#FFFFFF",
        textColorSecondary: "#8E8E93",
        backgroundColorSecondary: "#F2F2F7",
        iconColor: "#00A5BA"
    },
    baseFontCustomization: {
        textFont: "Roboto, sans-serif",
        textSize: "16px",
        textWeight: "400",
        textStyle: "normal"
    },
    titleFontCustomization: {
        textFont: "inherit",
        textSize: "36px",
        textWeight: "500",
        textStyle: "normal"
    },
    buttonCustomization: {
        textFont: "inherit",
        textSize: "14px",
        textWeight: "500",
        textStyle: "normal",
        textColorPrimary: "#FFFFFF",
        backgroundColorPrimary: "#00A5BA",
        textColorSecondary: "#00A5BA",
        backgroundColorSecondary: "#DBF2F5",
        cornerRadius: "10px"
    },
    toolbarCustomization: {
        closeButtonIcon: "cross",
        iconColor: "#707070"
    },
    centerHintCustomization: {
        textFont: "inherit",
        textSize: "24px",
        textWeight: "500",
        textStyle: "normal",
        textColor: "#FFFFFF",
        backgroundColor: "#1C1C1E",
        backgroundOpacity: "56%",
        backgroundCornerRadius: "14px",
        verticalPosition: "38%"
    },
    hintAnimation: {
        hideAnimation: false,
        hintGradientColor: "#00BCD5",
        hintGradientOpacity: "100%",
        animationIconSize: "80px"
    },
    faceFrameCustomization: {
        geometryType: "oval",
        cornersRadius: "0px",
        strokeDefaultColor: "#D51900",
        strokeFaceInFrameColor: "#00BCD5",
        strokeOpacity: "100%",
        strokeWidth: "6px",
        strokePadding: "4px"
    },
    documentFrameCustomization: {
        cornersRadius: "20px",
        templateColor: "#FFFFFF",
        templateOpacity: "100%"
    },
    backgroundCustomization: {
        backgroundColor: "#FFFFFF",
        backgroundOpacity: "88%"
    },
    antiscamCustomization: {
        enableAntiscam: false,
        textMessage: "",
        textFont: "inherit",
        textSize: "14px",
        textWeight: "500",
        textStyle: "normal",
        textColor: "#000000",
        textOpacity: "100%",
        backgroundColor: "#F2F2F7",
        backgroundOpacity: "100%",
        backgroundCornerRadius: "20px",
        flashColor: "#FF453A"
    },
    versionTextCustomization: {
        textFont: "inherit",
        textSize: "16px",
        textWeight: "500",
        textStyle: "normal",
        textColor: "#000000",
        textOpacity: "56%"
    },
    maskCustomization: {
            maskColor: "#008700",
            glowColor: "#000102",
            minAlpha: "30%", // от 0 до 1 или 0-100%
            maxAlpha: "100%" // от 0 до 1 или 0-100%
    }
}
});

baseColorCustomization

Основные цветовые настройки.

Параметр

Описание

textColorPrimary

Основной цвет текста

backgroundColorPrimary

Основной цвет фона

textColorSecondary

Дополнительный цвет текста

backgroundColorSecondary

Дополнительный цвет фона

iconColor

Цвет значков

baseFontCustomization

Основные настройки шрифта.

Параметр

Описание

textFont

Шрифт

textSize

Размер шрифта

textWeight

Насыщенность шрифта

textStyle

Стиль текста

titleFontCustomization

Настройки шрифта заголовка.

Параметр

Описание

textFont

Шрифт

textSize

Размер шрифта

textWeight

Насыщенность шрифта

textStyle

Стиль текста

buttonCustomization

Настройки кнопок.

Параметр

Описание

textFont

Шрифт

textSize

Размер шрифта

textWeight

Насыщенность шрифта

textStyle

Стиль текста

textColorPrimary

Основной цвет текста

backgroundColorPrimary

Основной цвет фона

textColorSecondary

Дополнительный цвет текста

backgroundColorSecondary

Дополнительный цвет фона

cornerRadius

Угловой радиус кнопки

toolbarCustomization

Настройки панели инструментов.

Параметр

Описание

closeButtonIcon

Значок кнопки закрытия

iconColor

Цвет значка

centerHintCustomization

Настройки подсказки в центре.

Параметр

Описание

textFont

Шрифт

textSize

Размер шрифта

textWeight

Насыщенность шрифта

textStyle

Стиль текста

textColor

Цвет текста

backgroundColor

Цвет фона

backgroundOpacity

Непрозрачность фона

backgroundCornerRadius

Угловой радиус подложки

verticalPosition

Положение по вертикали

hintAnimation

Анимация подсказки.

Параметр

Описание

hideAnimation

Скрыть анимацию

hintGradientColor

Цвет градиента

hintGradientOpacity

Непрозрачность градиента

animationIconSize

Размер значка анимации

faceFrameCustomization

Настройки рамки вокруг лица.

Параметр

Описание

geometryType

Форма рамки – прямоугольник или овал

cornersRadius

Угловой радиус прямоугольника

strokeDefaultColor

Цвет рамки (лицо не в кадре)

strokeFaceInFrameColor

Цвет рамки (лицо в кадре)

strokeOpacity

Непрозрачность обводки

strokeWidth

Толщина линии обводки

strokePadding

Отступ в рамке

documentFrameCustomization

Настройки рамки для съемки документа.

Параметр

Описание

cornersRadius

Угловой радиус

templateColor

Цвет шаблона

templateOpacity

Непрозрачность шаблона

backgroundCustomization

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

Параметр

Описание

backgroundColor

Цвет фона

backgroundOpacity

Непрозрачность фона

antiscamCustomization

Настройки защиты от мошенников: при включении во время записи видео появляется дополнительное сообщение.

Параметр

Описание

textMessage

Текст сообщения

textFont

Шрифт

textSize

Размер шрифта

textWeight

Насыщенность шрифта

textStyle

Стиль текста

textColor

Цвет текста

textOpacity

Непрозрачность текста

backgroundColor

Цвет фона

backgroundOpacity

Непрозрачность фона

backgroundCornerRadius

Угловой радиус подложки

flashColor

Цвет мигающего индикатора

versionTextCustomization

Настройки текста версии SDK.

Параметр

Описание

textFont

Шрифт

textSize

Размер шрифта

textWeight

Насыщенность шрифта

textStyle

Стиль текста

textColor

Цвет текста

textOpacity

Непрозрачность текста

maskCustomization

Настройки 3D-маски, добавленной в версии 1.2.1.

Параметр

Описание

maskColor

Цвет самой маски

glowColor

Цвет обводки маски

minAlpha

Минимальный уровень прозрачности маски (добавлено в 1.3.1)

maxAlpha

Максимальный уровень прозрачности маски (добавлено в 1.3.1)

Переход на новый дизайн с предыдущих версий (до 1.0.1)

Таблица соответствия параметров:

Предыдущий дизайн

Новый дизайн

doc_color

-

face_color_success

faceFrame.faceReady

faceFrameCustomization.strokeFaceInFrameColor

face_color_fail

faceFrame.faceNotReady

faceFrameCustomization.strokeDefaultColor

centerHint.textSize

centerHintCustomization.textSize

centerHint.color

centerHintCustomization.textColor

centerHint.yPosition

centerHintCustomization.verticalPosition

centerHint.letterSpacing

-

centerHint.fontStyle

centerHintCustomization.textStyle

closeButton.image

-

backgroundOutsideFrame.color

backgroundCustomization.backgroundColor

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

OzLiveness.open({
  // ...
  style: {
	  //блок для обратной совместимости
    doc_color: "", 
    face_color_success: "",
    face_color_fail: "", 
	//основной блок
    faceFrame: {
      faceReady: "",
      faceNotReady: "",
    },
    centerHint: {
      textSize: "",
      color: "",
      yPosition: "",
      letterSpacing: "", 
      fontStyle: "", 
    },
    closeButton: {
      image: "",
    },
    backgroundOutsideFrame: {
      color: "", 
    },
  },
  // ...
});

Настройка Web Adapter через переменные окружения

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

  • WA_ARCHITECTURE – переопределяет параметр architecture

  • WA_API_URL – переопределяет параметр api_url

Пример использования переменных окружения при запуске docker-образа Web SDK в режиме Lite.

docker run -d -p 80:80 \
-e WA_ARCHITECTURE=lite \
-e WA_API_URL='http://127.0.0.1:8000/v1/face/liveness/detect' \
ozforensics/oz-webliveness:{tag}

параметра настройки Web Adapter
здесь
Рекомендациями по безопасности
ISO 639-1
здесь
здесь
Angular
React
Vue
Svelte
Добавление плагина на web-страницу
Запуск плагина
Скрытие и закрытие плагина
Локализация: добавление собственного языкового пакета
Настройка интерфейса
Рекомендации по безопасности
Совместимость с браузерами
Лицензирование без использования сервера
плагина
ссылке
параметра настройки Web Adapter
здесь
Рекомендациями по безопасности
авторизацию
распределение прав доступа
Коллекции Postman Oz API
Коллекции Postman
Аутентификация
здесь
роверьте результат
вебхук
здесь
здесь
Интеграция Oz Liveness Web SDK
Интеграция Oz Liveness Mobile SDK
здесь
метод
метод
запрос
веб-консолью
руководстве разработчика
Интеграция Oz Liveness Web SDK
Интеграция Oz Liveness Mobile SDK
здесь
здесь
веб-консолью
руководстве разработчика
OzAction
LicenseSource
OzConnection
OzConnection
OzAbstractMedia
AnalysisStatus
RequestResult
Analysis
Analysis
OzAbstractMedia
OzAttemptsSettings
OzUploadMediaSettings
OzLocalizationCode
OzLogging
Color
Color
Color
Color
Color
Color
GeometryType
Color
Color
Color
Color
Color
Color
Color
OzMediaTag
OzMediaTag
OzMediaTag
Analysis
OzAbstractMedia
Type
Mode
OzAbstractMedia
SizeReductionStrategy
OzAbstractMedia
Resolution
SourceMedia
Type
AnalysisResult
Resolution
Resolution
Type
Mode
ResultMedia
AnalysisError
попыток анализа
Жесты
LicenseError
значении status
здесь
установить
  1. Работа на ваших серверах

  1. SaaS

  • Ничего делать не нужно, установку и настройку серверной части обеспечивают инженеры Oz Forensics. Вы получите ссылку для интеграции (см. п. 2).

Параметр

Тип

Описание

licenseSources

Источник лицензии

Параметр

Тип

Описание

licenseSource

Источник лицензии

Параметр

Тип

Описание

apiConnection

Параметры авторизации

Параметр

Тип

Описание

eventsConnection

Параметры авторизации для телеметрии

Параметр

Тип

Описание

delegate

Делегат Oz Liveness

actions

Действие на видео

cameraPosition (опционально)

AVCaptureDevice.Position

front – фронтальная камера (по умолчанию), back – основная камера

Параметр

Тип

Описание

actions

Действие на видео

FaceCaptureCompletion

type alias

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

public typealias FaceCaptureCompletion = (_ results: [OZMedia]?, _ error: OZVerificationStatus?) -> Void

cameraPosition (опционально)

AVCaptureDevice.Position

front – фронтальная камера (по умолчанию), back – основная камера

Параметр

Тип

Описание

media

Массив медиафайлов

folderMeta

[String]

Дополнительные метаданные папки

Параметр

Тип

Описание

String

Код локали

Параметр

Тип

Описание

singleCount

Int

Количество попыток для одного действия/;tcnf

commonCount

Int

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

faceAlignmentTimeout

Float

Время, в течение которого нужно поместить лицо в рамку

uploadMediaSettings

Настройки повторной отправки медиафайлов

Параметр

Тип

Описание

results

Массив объектов OzMedia

Параметр

Тип

Описание

status

Описание ошибки

Параметр

Тип

Описание

media

Объект или массив объектов OzMedia

Параметр

Тип

Описание

statusHandler

Callback-функция

statusHandler: @escaping ((_ status: RequestStatus) -> Void)

errorHandler

Callback-функция

errorHandler: @escaping ((_ error: Error) -> Void)

Вызывается при возникновении ошибки

completionHandler

Callback-функция

completionHandler: @escaping (_ results : RequestResult) -> Void)

Параметр

Тип

Описание

geometryType

Форма рамки: овал, прямоугольник, круг или квадрат

cornerRadius

CGFloat

Угловой радиус прямоугольника/квадрата (в dp)

strokeFaceNotAlignedColor

UIColor

Цвет рамки, когда лицо не в кадре

strokeFaceAlignedColor

UIColor

Цвет рамки, когда лицо в кадре

strokeWidth

CGFloat

Толщина линии (в dp, 0-20)

strokePadding

CGFloat

Отступ от рамки до овала, куда нужно поместить лицо (в dp, 0-10)

Параметр

Тип

Описание

movement

Действие на видео

mediaType

Тип медиафайла

metaData

[String]

Метаданные, если есть

videoURL

URL

URL видео с проверкой Liveness

bestShotURL

URL

URL лучшего кадра в формате PNG

preferredMediaURL

URL

URL медиаконтейнера API

timestamp

Date

Время окончания проверки

Параметр

Тип

Описание

media

Массив объектов OzMedia

type

Тип анализа

mode

Режим анализа

sizeReductionStrategy

Определяет размер файла, отправляемого на сервер после успешного завершения проверки на устройстве в составе гибридного анализа.

params (опционально)

String

Дополнительные параметры

Параметр

Тип

Описание

media

Объект, который загружается в данный момент

index

Int

Номер объекта в списке

from

Int

Количество объектов

progress

Progress

Статус загрузки

Параметр

Тип

Описание

status

Статус обработки анализов

progressStatus

Статус загрузки медиафайла

Параметр

Тип

Описание

resolution

Общий результат анализа

sourceId

String

Идентификатор медиафайла на сервере

isOnDevice

Bool

Режим анализа

confidenceScore

Float

Итоговая оценка

mediaType

String

Тип медиафайла: VIDEO / IMAGE / SHOT_SET

media

Анализируемый медиафайл

error

AnalysisError (наследуется от базового Error)

Ошибка

Параметр

Тип

Описание

resolution

Сводный результат анализов

folderId

String

Идентификатор

analysisResults

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

Параметр

Тип

Описание

resolution

Общий результат анализа

type

Тип анализа

mode

Режим анализа

analysisId

String

Идентификатор анализа

error

AnalysisError (наследуется от базового Error)

Ошибка

resultMedia

Список результатов анализов по отдельным медиафайлам

confidenceScore

Float

Итоговая оценка

serverRawResponse

String

Ответ сервера

Параметр

Тип

Описание

analyseResolutionStatus

Статус анализа

type

Тип анализа

folderID

String

Идентификатор папки

score

Float

Результат выполненной проверки

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

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

Параметры:

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

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

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

lang_id
Язык

en

Английский

ru

Русский

es

Испанский

pt-br*

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

kz

Казахский

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

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

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

// Редактируем текст кнопки
OzLiveness.add_lang('ru', {
  action_photo_button: 'Сделать фото'
});

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

OzLiveness.open({
    lang: 'es', // идентификатор нужного языка
    ...
});

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

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

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

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

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

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

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

Журнал изменений Web SDK.

1.7.13 – 02.04.2025

  • Добавили поддержку для будущей версии API 6.0.

  • Улучшили работу озвучки SDK: экранные дикторы читают подсказки по мере прохождения проверок (доступ к камере, загрузка и обработка данных, запрос результата) правильнее и при переключении подсказок реагируют быстрее.

  • Добавили возможность проверки лицензии: [GET] /check_license.php.

  • Уменьшили размер загружаемых компонентов.

  • Результаты анализа в коллбэке on_complete при result_mode: full теперь передаются корректно.

  • Кнопка переключения камеры теперь видна всегда.

  • Передняя камера больше не отзеркаливает действия пользователя.

  • Улучшили обработку ошибок.

  • SDK теперь лучше работает на устройствах с низкой производительностью.

  • Добавили проверку на закрытые глаза для жеста Scan.

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

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

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

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

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

  • Мы вернули поддержку 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

  • Обновили телеметрию (журналирование).

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 на португальский, испанский и казахский языки.

  • Добавили жест Комбо.

  • Добавили шкалу прогресса для загрузки медиа.

  • Жесты 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.

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-кадр.

  • Best Shot теперь работает корректно.

0.3.2004 (0.4.8)

  • В ответах сервера код ошибки и расшифровка теперь передаются раздельно.

0.3.2001 (0.4.6)

  • Если режим для SDK настроен в переменных окружения architecture, api_url, то он применяется в настройках автоматически.

  • В режиме lite можно выбрать best frame для любого действия.

  • В режиме lite фото, отправленное через API, получает статус on_complete только при успешном liveness.

  • Можно управлять cors из переменных окружения (по умолчанию заголовки cors не добавляются).

0.3.1999

  • Добавили значение folder для result_mode: оно возвращает тот же ответ, что и значение status, но с folder_id.

0.3.1997 (0.4.5)

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

  • Оптимизировали отправку данных: теперь изображения отправляются в отдельных полях формы, а не в одном JSON-объекте.

  • Добавили проверку поддерживаемых параметров камеры.

0.3.1992 (0.4.4)

  • Включили новый метод шифрования изображений.

  • Оптимизировали формат отправки изображений.

0.3.1991

  • Добавили опцию use_for_liveness: при съемке лица на мобильных устройствах выбирается тыловая камера, а на десктопе отключаются флип и обводка овала. По умолчанию опция отключена.

0.3.1990 (0.4.3)

  • Уменьшили время видео video_selfie_best (жест Selfie) с 1 до 0,2 сек.

  • Оптимизировали загрузку скриптов – теперь ее можно настраивать.

  • Повысили точность работы алгоритмов.

0.3.1988 (0.4.2)

  • Добавили казахский язык.

  • Добавили инструкцию по доступу к камере для десктопа.

  • Дополнили журналирование – пишутся запросы к plugin_liveness.php и user-agent в лог сервера.

  • Добавили возможность работы с режимом Lite.

0.3.1987 (0.4.1)

  • Добавили шифрование.

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

0.3.1986 (0.3.91)

  • Добавили возможность скрывать логотип Oz Forensics.

0.3.1984

  • Дополнили руководства для некоторых браузеров и социальных сетей.

  • Добавили обработку неизвестных и руководство для "неизвестных" браузеров.

0.3.1983

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

  • Добавили руководство по включению камер в различных браузерах под Android.

Руководство администратора

В этом разделе собрана информация о том, как управлять процессом работы с продуктами Oz Forensics со стороны клиента.

Сервер лицензий

Установка офлайн-сервера для лицензирования

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

Установка по шагам

1. Распакуйте архив

mkdir /opt/oz
cd /opt/oz
tar xzf oz-lic.tar.gz

2. Установите службу лицензирования

./LexFloatServer -p product.dat -c config.yml -i --service-name ozlic

На этом серверная установка окончена. Дальнейшая настройка и активация производится через Web-интерфейс на порту 8090.

3. Активируйте лицензию

Откройте в браузере страницу по адресу http://server:8090 и авторизуйтесь.

Зайдите в раздел Settings.

Онлайн-активация

Наиболее простой способ активировать сервер лицензирования – выполнить это онлайн.

Для этого достаточно ввести ключ и нажать ACTIVATE.

Офлайн-активация

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

Для этого нажмите SWITCH TO OFFLINE ACTIVATION.

Введите ключ и нажмите NEXT.

Затем нажмите DOWNLOAD REQUEST FILE.

Введите этот код в окно для offline activation response и нажмите ACTIVATE.

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

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

Если вы используете Oz Web SDK по модели SaaS, с вопросами по установке и лицензированию, пожалуйста, обращайтесь к нашим инженерам.

Установка

Лицензирование

Этот раздел относится в первую очередь к обновлению лицензии, так как при установке Oz Web SDK лицензия также устанавливается, однако в случае надобности вы можете произвести первичную установку лицензии по такому же алгоритму.

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

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

  1. Распакуйте полученный файл.

unzip license.0000aaaa-00aa-00aa-00aa-00000aaaaa.WebSDK_your_website.2022-10-11.json.zip

2. Скопируйте JSON-файл лицензии на хост, где развернут контейнер из образа ozforensics/oz-webliveness-dev:latest.

Пример

scp -i ~/ozforensics/keys/id_rsa-test-hostname-vm license.0000aaaa-00aa-00aa-00aa-00000aaaaa.WebSDK_your_website.2022-10-11.json user@hostname:/opt/oz/web-sdk
  • -i ~/ozforensics/keys/id_rsa-test-hostname-vm – путь к публичному ssh-ключу хоста

  • 0000aaaa-00aa-00aa-00aa-00000aaaaa.WebSDK_your_website.2022-10-11.json – файл лицензии в формате JSON.

  • user – имя пользователя на хосте.

  • hostname – псевдоним хоста.

  • /opt/oz/web-sdk – каталог на хосте, где развернут контейнер Web SDK.

3. Замените файл лицензии.

Пример

ssh user@hostname -i ~/ozforensics/keys/id_rsa-test-hostname-vm sudo cp -v /opt/oz/web-sdk/license.license.0000aaaa-00aa-00aa-00aa-00000aaaaa.WebSDK_your_website.2022-10-11.json /opt/oz/web-sdk/license.json

4. Перезапустите контейнер Web SDK.

Пример

ssh user@hostname -i ~/ozforensics/keys/id_rsa-test-hostname-vm sudo docker restart web-sdk
  • web-sdk – название контейнера, созданного из образа ozforensics/oz-webliveness-dev:latest.

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

Далее при каждом запуске Web SDK система будет проверять валидность лицензии. Чтобы выполнить проверку вручную, воспользуйтесь методом [GET] /check_license.php.

Возможные ошибки лицензирования

Ошибка

Описание

License error. License at <> not found

Файл лицензии не найден

License error. Cannot parse license from <>, invalid format

Невозможно прочитать лицензию (файл содержит ошибки)

License error. Current date is later than license expiration date

Срок действия лицензии истек, необходимо обновление

License error. Origin is not in the list permitted by license

Адрес домена или субдомена не найден в списке адресов, указанных в лицензии

Настройки файла конфигурации

В этом разделе описано содержимое файла конфигурации /core/app_config.json.

  • use_for_liveness – опция применяется при использовании WebSDK операторами банка для съемки клиентов. Если use_for_liveness = true, при съемке лица на мобильных устройствах выбирается тыловая камера, на десктопе отключается флип; отключается обводка овала;

  • preinit – параметр включает предварительную загрузку библиотек и инициализацию, уменьшая время использования plugin. Параметр необязательный, значение по умолчанию off – загрузка скриптов и инициализация происходит после открытия plugin и вызова функции OzLiveness.open(). В таком режиме plugin не создает нагрузки на сайт (приложение), на котором он установлен, но сам plugin может открываться долго из-за описанных выше процессов. Значение script – предварительная загрузка только библиотек плагина. Значение full – предварительная загрузка библиотек и инициализация процесса определения лица.

  • architecture – выбор архитектуры, в которой используется WebSDK. Параметр необязательный, значение по умолчанию normal.

    • normal для включения полной версии Oz API;

  • api_url – адрес сервера Oz API, текстовый параметр;

  • api_token – токен для доступа к Oz API, текстовый параметр;

  • api_use_token – параметр, определяющий источник получения системой токена для доступа к Oz API. Возможные значения = config, client.

    • Если установлено значение client, то токен для доступа к Oz API ожидается от JS-плагина;

    • Если установлено значение config, то токен берется из параметра api_token файла /core/app_config.json.

  • actions_default_importance – возможность при запуске анализа переопределить массив действий из WEB-плагина. Возможные значения = true, false;

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

    • Если установлено false, то адаптер будет использовать массив действий, переданный из браузера методом open(options).

  • actions_default – массив действий. Доступные параметры:

    • video_count – количество передаваемых видеофайлов, числовой параметр;

    • photo_front – наличие фронтальной страницы документа. Возможные значения = true, false;

    • photo_back – наличие оборотной страницы документа. Возможные значения = true, false.

  • analyses – блок настройки запуска анализов. Доступные параметры:

    • quality – запуск анализа Oz Liveness. Возможные значения = true, false;

    • biometry – запуск анализа Oz Biometry. Возможные значения = true, false;

    • documents – запуск анализа Oz Text. Возможные значения = true, false;

    • collection_ids (с версии 1.4.0) – массив идентификаторов коллекций для анализа по черному списку.

  • extract_best_shot – параметр, определяющий необходимость добавления в результат анализа прямой ссылки на лучший кадр, извлеченный из видео. Возможные значения = true, false. Если установлено true, в ответе в output_images (results_media) будет ссылка на извлеченное изображение;

  • result_mode – параметр, определяющий содержание ответа сервера с результатами проверки. Возможные значения:

    • safe – возвращается только состояние анализов (завершены или еще нет);

    • status – возвращаются результаты выполнения анализов;

    • folder – то же самое, что status, но дополнительно возвращается folder_id;

    • full – возвращается полный ответ Oz API по анализам в формате JSON.

  • result_codes – блок кодов ответа с комментариями.

  • delete_old_sessions – если установлено true, старые сессии удаляются.

  • delete_old_sessions_offset_minutes – если установлено, старые сессии удаляются с соответствующим смещением в минутах.

"video_required_actions_list":
[
    "video_selfie_smile"
],
  • save_lossless_frame– если true, исходный кадр сохраняется без сжатия.

  • debug (с версии 1.1.0) – при значении true дает возможность открыть страницу /debug.php, на которой размещена информация о текущих конфигурации и лицензии.

  • load_3d_mask (с версии 1.2.1) – если установлено true, загружает модели для обработки видео, снятого с помощью 3D-маски. Значение по умолчанию – false; в этом случае модель не подгружается, и 3D-маску использовать нельзя (параметр enable_3d_mask игнорируется).

  • enable_3d_mask (с версии 1.2.1) – включает использование 3D-маски при съемке вместо овала. Параметр работает только в случае load_3d_mask= true; значение по умолчанию – false.

  • master_license_signature (с версии 1.3.1) – подпись мастер-лицензии; по умолчанию null.

  • results_polling_interval (с версии 1.4.0) – интервал опроса для получения результатов анализов, мс; значение по умолчанию — 1000.

  • get_user_media_timeout (с версии 1.5.0) – определяет время, по истечении которого отобразится подсказка о том, как получить доступ к камере, если к тому моменту доступ не был получен; default_default для всех браузеров и android_facebook для Facebook браузеров.

"get_user_media_timeout": {
        "default_default": 40,
        "android_facebook": 5
    }
  • disable_adapter_errors_on_screen (с версии 1.5.0) – выключает отображение ошибок в модальных окнах, оставляя возможность их просмотра только в коллбэке on_error. Значение по умолчанию – False.

Конфигурация Web Adapter

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

Если вы используете Oz Web SDK по модели SaaS, пожалуйста, обращайтесь к нашим инженерам.

Настройка Oz Liveness WEB Adapter производится путем изменения конфигурационного файла, расположенного на сервере Oz Liveness WEB Adapter по пути /core/app_config.json

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

Выполнение анализов на устройстве

Обычный режим выполнения проверок на iOS / Android SDK подразумевает проведение проверок на сервере: данные для анализов Liveness и Biometry с телефона отсылаются на сервер, где и происходит сам анализ, затем сервер отправляет результаты анализов обратно на телефон. Этот процесс показан на схеме ниже:

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

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

Подключение к API может потребоваться в некоторых специфических ситуациях, например, для сбора телеметрии или конфигурации SDK с сервера.

Когда может понадобиться режим анализа на устройстве?

  • Вы не планируете собирать и обрабатывать персональные данные;

  • Вам необходима быстрая и не зависящая от скорости сети верификация – например, в удаленных регионах, внутри зданий, под землей и так далее;

  • У вас ограниченный бюджет и вы хотели бы сэкономить на оборудовании.

Запуск анализов на устройстве

Для запуска анализов на устройстве установите соответствующий режим (mode) анализа для Android или iOS SDK.

Android:

analysisCancelable = AnalysisRequest.Builder()
    .addAnalysis(Analysis(Analysis.Type.QUALITY, Analysis.Mode.ON_DEVICE, mediaToAnalyze))
analysisCancelable = new AnalysisRequest.Builder()
    .addAnalysis(new Analysis(Analysis.Type.QUALITY, Analysis.Mode.ON_DEVICE, mediaList)) 

iOS:

let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .onDevice)

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

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

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

Пример payload
{    
  "resolution_endpoint": "address.com", // укажите нужный адрес здесь
    ... // остальные детали запроса
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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) { /*обработка исключения */ }
    }
);

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

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

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

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, как показано выше в этой статье

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

Журнал изменений для Android.

8.16.3 – 08.04.2025

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

8.16.2 – 19.03.2025

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

8.16.1 – 14.03.2025

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

8.16 – 11.03.2025

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

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

  • Исправили наблюдавшуюся на некоторых устройствах ошибку с зависанием SDK после завершения съемки видео.

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

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

8.15.6 – 26.02.2025

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

8.15.5 – 18.02.2025

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

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

8.15.4 – 11.02.2025

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

8.15.0 – 30.12.2024

  • Добавлен правильный порядок фокусировки для VoiceOver при включенной антискам-подсказке.

  • Добавлена ​​публичная настройка extract_action_shot в Демо Приложении.

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

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

8.14.1 – 05.12.2024

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

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

8.14.0 – 02.12.2024

  • Обновления доступности для пользователей с инвалидностью согласно требованиям WCAG: можно настроить озвучивание подсказок SDK и элементов управления.

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

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

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

  • Исправили незначительные ошибки.

  • Обновления телеметрии.

8.13.0 – 12.11.2024

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

8.12.4 – 01.10.2024

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

8.12.2 – 10.09.2024

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

8.12.0 – 29.08.2024

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

8.11.0 – 19.08.2024

  • Исправили ошибку RuntimeException, появлявшуюся в режиме серверного Liveness на некоторых моделях телефонов.

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

8.10.0 – 26.07.2024

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

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

8.9.0 – 18.07.2024

  • Подняли версию плагина Android Gradle до 8.0.0.

  • Улучшили работу SDK.

8.8.3 – 11.07.2024

  • Улучшили работу SDK.

8.8.2 – 21.06.2024

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

8.8.1 – 12.06.2024

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

8.8.0 – 04.06.2024

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

8.7.3 – 03.06.2024

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

8.7.0 – 06.05.2024

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

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

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

8.6.0 – 05.04.2024

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

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

8.5.0 – 27.02.2024

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

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

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

8.4.4 – 06.02.2024

  • Изменили алгоритм валидации для мастер-лицензии.

8.4.3 – 29.01.2024

  • Снизили требования к compileSdkVersion с 34 до 33.

8.4.2 – 15.01.2024

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

8.4.0 – 04.01.2024

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

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

8.3.3 – 11.12.2023

  • Улучшили работу механизмов лицензирования.

8.3.2 – 30.11.2023

  • Улучшили работу SDK.

8.3.1 – 24.11.2023

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

8.3.0 – 17.11.2023

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

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

8.2.1 – 01.11.2023

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

8.2.0 – 23.10.2023

  • Добавили в структуру Analysis поле sizeReductionStrategy. Оно определяет размер файла, отправляемого на сервер после успешного завершения проверки на устройстве в составе гибридного анализа.

  • Настройка toFrameGradientColor для кастомизации подсказки hintAnimationCustomization больше не используется. Вместо нее используйте hintGradientColor.

  • Сообщения для получаемых из API ошибок теперь детализированы.

8.1.1 – 02.10.2023

8.1.0 – 07.09.2023

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

  • Добавили португальский язык (бразильский вариант).

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

  • Добавили новый метод для получения идентификатора телеметрии (логирования): getEventSessionId.

  • Методы auth и login больше не используются. Вместо них, пожалуйста, используйте метод setApiConnection.

  • OzConfig.baseURL и OzConfig.permanentAccessToken больше не используются.

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

  • Исправили ошибки и улучшили работу SDK.

8.0.3 – 24.08.2023

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

8.0.2 – 13.07.2023

  • При установке baseURL = null SDK теперь работает корректно.

8.0.1 – 28.06.2023

  • Версии зависимостей SDK приведены в соответствие с версией Kotlin.

8.0.0 – 19.06.2023

  • Добавлен новый тип анализа – гибридный (сейчас работает только для Liveness). В случае спорных результатов анализа на устройстве проводится дополнительная проверка на сервере.

  • Требования к версии Kotlin понижены до 1.7.21.

  • Обновлены модели для анализов на устройстве.

  • На некоторых моделях телефонов исправлена ошибка fatal device.

  • Текст подсказки теперь может выходить за границы рамки для лица по горизонтали (для основной камеры).

  • Фото, снятые во время однокадрового анализа, теперь передаются на сервер в оригинальном размере.

  • Удален класс OzAnalysisResult. В параметре onSuccess метода AnalysisRequest.run вместо списка OzAnalysisResult теперь передается структура RequestResult.

  • Все исключения перенесены в папку com.ozforensics.liveness.sdk.core.exceptions (детальная информация ниже).

  • Связанные с AnalysisRequest классы перенесены в com.ozforensics.liveness.sdk.analysis (детальная информация ниже).

  • Прекращена поддержка методов:

Изменения в публичном интерфейсе

Новые сущности

  • AnalysisRequest.Type.HYBRID в com.ozforensics.liveness.sdk.analysis.entity

  • AnalysisError в com.ozforensics.liveness.sdk.analysis.entity

  • SourceMedia в com.ozforensics.liveness.sdk.analysis.entity

  • ResultMedia в com.ozforensics.liveness.sdk.analysis.entity

  • RequestResult в com.ozforensics.liveness.sdk.analysis.entity

Перенос

  • NoAnalysisException из com.ozforensics.liveness.sdk.exceptions в com.ozforensics.liveness.sdk.core.exceptions

  • NoNetworkException из com.ozforensics.liveness.sdk.exceptions в com.ozforensics.liveness.sdk.core.exceptions

  • TokenException из com.ozforensics.liveness.sdk.exceptions в com.ozforensics.liveness.sdk.core.exceptions

  • NoMediaInAnalysisException из com.ozforensics.liveness.sdk.exceptions в com.ozforensics.liveness.sdk.core.exceptions

  • EmptyMediaListException из com.ozforensics.liveness.sdk.exceptions в com.ozforensics.liveness.sdk.core.exceptions

  • NoSuchMediaException из com.ozforensics.liveness.sdk.exceptions в com.ozforensics.liveness.sdk.core.exceptions

  • LicenseException из com.ozforensics.liveness.sdk.exceptions в com.ozforensics.liveness.sdk.security.exception

  • Analysis из com.ozforensics.liveness.sdk.analysis.entity в com.ozforensics.liveness.sdk.core.model

  • AnalysisRequest из com.ozforensics.liveness.sdk.analysis в com.ozforensics.liveness.sdk.core

  • AnalysisListener из com.ozforensics.liveness.sdk.analysis в com.ozforensics.liveness.sdk.core

  • AnalysisStatus из com.ozforensics.liveness.sdk.analysis в com.ozforensics.liveness.sdk.core

  • AnalysisRequest.Builder из com.ozforensics.liveness.sdk.analysis в com.ozforensics.liveness.sdk.core

  • OzException из com.ozforensics.liveness.sdk.exceptions в com.ozforensics.liveness.sdk.core.exceptions

Измененные классы

OzLivenessSDK

  • Удален метод uploadMediaAndAnalyze

  • Удален метод uploadMedia

  • Удален метод runOnDeviceBiometryAnalysis

  • Удален метод runOnDeviceLivenessAnalysis

AnalysisRequest

  • Удален метод build(): AnalysisRequest

AnalysisRequest.Builder

  • Удален метод addMedia

  • Удален метод onSuccess(result: List<OzAnalysisResult>)

  • Добавлен метод onSuccess(result: RequestResult)

7.3.1 – 07.06.2023

  • Обновили экран настроек.

  • Добавили настройки для фона подсказки.

  • Добавили новые формы рамки (круг, квадрат).

  • Метод OzLivenessSDK::init при передаче параметра StatusListener теперь работает корректно.

  • Изменили анимацию жеста "Сканирование".

Обратите внимание: с этой версии используется Kotlin 1.8.20.

7.2.0 – 04.05.2023

  • Улучшили работу алгоритмов SDK.

7.1.4 – 30.03.2023

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

  • Обновили анимацию для солнечных очков / маски.

  • Немного уменьшили размеры овала для Liveness.

7.1.3 – 03.03.2023

  • Исправили ошибку, появлявшуюся при выполнении серверных анализов после использования для авторизации permanentAccessToken.

7.1.2 – 22.02.2023

  • Полосу статуса и системные кнопки теперь можно скрывать (работает с версии 7.0.0).

  • В метод OzLivenessSDK.init теперь нужно первым параметром передавать context.

  • OzAnalysisResult теперь корректно показывает оценки по серверным анализам.

  • Исправлены ошибки инициализации и некорректного отображения настроек кастомизации, а также ошибки некорректной авторизации на версиях Android < 7.1.1.

7.1.1 – 16.01.2023

  • Исправили ошибку с вылетами на версиях Android <6.

  • Поправили расположение овала для некоторых моделей телефонов.

  • Улучшили работу SDK.

7.1.0 – 16.12.2022

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

  • Добавили некоторые внутренние улучшения.

  • Метод addMedia больше не работает. Для загрузки медиафайлов воспользуйтесь методом uploadMedia.

7.0.0 – 23.11.2022

  • Из соображений безопасности мы теперь поставляем два типа библиотек: sdk только для серверного анализа и full для серверного анализа и анализа на устройстве.

  • Заменили OzCustomization на UICustomization.

  • Добавили испанский язык.

6.4.2

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

  • SDK теперь снимает видео в разрешении 720p (с 6.4.2.3).

6.4.1

  • Наименование режимов анализа приведено в соответствие с iOS: SERVER_BASED и ON_DEVICE.

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

6.4.0

  • Теперь в качестве Liveness-экрана можно использовать Fragment.

  • Добавили новое поле params в структуру Analysis – с его помощью можно задавать дополнительные параметры, например, для извлечения на сервере лучшего кадра. Алгоритм "лучший кадр" выбирает из видеозаписи наиболее качественный и удачный кадр с лицом.

6.3.7

  • Жесты отдаления и приближения больше не поддерживаются.

6.3.6

  • Обновили биометрическую модель.

6.3.5

  • Добавили новую упрощенную структуру AnalysisRequest – теперь конструировать запросы на анализы стало проще и удобнее.

6.3.4

  • Добавили модуль для выполнения анализов локально на устройстве. Подключите модуль:

Для запуска анализов biometry и liveness используйте соответствующие методы класса OzLivenessSDK: runOnDeviceBiometryAnalysis и runOnDeviceLivenessAnalysis.

6.3.3

  • Liveness теперь работает плавнее.

  • На устройствах Xiaomi больше не зависает камера.

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

6.3.1

  • В OzLivenessSDK.uploadMedia добавили параметр metadata и методы OzLivenessSDK.uploadMediaAndAnalyze для передачи metadata в папки.

6.2.8

  • Добавили функции для инициализации SDK с лицензиями LicenseSources: LicenseSource.LicenseAssetId иLicenseSource.LicenseFilePath. Для инициализации используйте метод OzLivenessSDK.init.

  • Добавили возможность получения информации о лицензии после инициализации val licensePayload = OzLivenessSDK.getLicensePayload().

6.2.4

  • Добавили киргизский язык.

6.2.0

  • Добавили функции для локальных анализов.

  • Добавили конфигурацию рамки вокруг лица.

  • Номер версии на экране Liveness теперь отображается корректно.

6.1.0

  • Добавили поддержку основной камеры.

6.0.0

  • Добавили жест OneShot.

  • Добавили состояний в OzAnalysisResult.Resolution.

  • Добавили метод uploadMediaAndAnalyze – он загружает список изображений/видео на сервер и сразу отправляет их на анализ.

  • OzMedia превратили в OzAbstractMedia и добавили подклассы изображений и видео.

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

5.1.0

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

  • Переименовали accessToken в permanentAccessToken.

  • Добавили правила R8.

  • Упростили процесс конфигурации. Свойства config теперь можно менять.

5.0.2

  • Исправили овальную рамку.

  • Убрали неиспользуемые параметры params из AnalyseRequest.

  • Убрали лимит по умолчанию на количество попыток.

5.0.0

  • Убрали свойства конфигурации - baseURL, accessToken и так далее. Заменили их на свойство config, которое нужно инициализировать с помощью OzConfig.Builder.

  • Добавили поддержку лицензий. Их нужно устанавливать как raw ресурсы и передавать в OzConfig через setLicenseResourceId.

  • Убрали методы, которым нужен был контекст. Заменили аналогами.

  • Анализ изображений теперь работает лучше.

  • Убрали ненужные зависимости.

  • Поправили ошибки журналирования.

Установите Web SDK. Вам помогут наши инженеры. Лицензия также будет установлена в этот момент. Когда вам потребуется ее обновить, воспользуйтесь .

Настройте .

[]

Callback-функция, которая вызывается по завершении метода. В качестве замыкания передается либо массив объектов , либо ошибка.

[]

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

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

[]

[]

[]

Улучшен поиск .

У некоторых пользователей ранее наблюдались зависания при использовании WebView. Теперь в этих случаях пользователь может нажать кнопку, чтобы продолжить работу с приложением. В связи с этим обновили файл со строками в . Ключ: tap_to_continue.

Web SDK теперь работает и с : вы можете сравнить лицо из снятого Liveness-медиафайла с лицами из вашей базы данных. Создайте коллекцию (или коллекции) с нужными фотографиями через или и добавьте соответствующий идентификатор (или идентификаторы) в массив analyses.collection_ids в файле конфигурации веб-адаптера.

Добавили 3D-маску, которая заменяет овал при съемке видео нашим SDK. Для включения маски установите load_3d_mask значение true.

Полностью переделали дизайн для SDK и демо, в том числе добавили настройки защиты от мошенников: при включении опции во время записи видео появляется дополнительное сообщение. Новые возможности настройки интерфейса описаны .

Значительно переработали :

для передачи при съемке информации о прямоугольнике, в который вписано лицо;

Внешний вид Web SDK теперь можно .

Для установки требуется любой стационарный (не виртуальный) сервер с ОС Linux. , чтобы получить архив с программой, и следуйте инструкции ниже.

файл offline_activation_request.txt . Мы в ответ направим вам код активации.

Установить SDK можно двумя способами: либо инженеры Oz Forensics делают все вручную, либо используется . В последнем случае потребуется вовлечение ваших специалистов. При установке Oz Web SDK Web Adapter сгенерирует нужные файлы Web Plugin: такие, как файл со стилями (ozliveness.css) и основной скрипт плагина (plugin_liveness.php).

lite для использования ;

capture – для работы с бэкэндом клиента напрямую. В этом случае возможно распространение Oz Liveness Web Plugin только через статические файлы, без адаптера (работает с версии 0.7.4);

video_actions_list – блок используемых в системе тегов файлов видео, текстовый массив. .

photo_actions_list – блок используемых в системе тегов файлов фотографий, текстовый массив. .

video_required_actions_list – массив обязательных действий, которые снимающему нужно воспроизвести. См. .

video_file_format – выбор формата видео, которое отправляется на api. Возможные значения – zip (рекомендуется), mov (менее безопасный вариант). Чтобы получить видео в MP4, воспользуйтесь инструкцией .

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

Перед началом работы желательно получить токен доступа.

  1. Создайте сервисную учетную запись (по умолчанию срок действия токена такой записи составляет 5 лет).

  2. Установите ПО Postman и скачайте нужную коллекцию API .

  3. Авторизуйтесь с помощью запроса POST {{host}}/api/authorize/auth, где {{host}} – адрес сервера API. В теле запроса укажите логин и пароль от созданной в п. 1 сервисной учетной записи. Более подробно авторизация описана .

  4. В ответе вам придет параметр access_token. Его значение нужно указать в параметре api_token файла настроек /core/app_config.json. В параметре api_use_token укажите config. Готово.

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

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

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

Подробнее приведенные примеры раскрыты в разделе Выполнение проверок для и соответственно.

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

Не указан токен .

Указан несуществующий .

просрочен.

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

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

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

Вы можете логотип Oz своим, если ваша лицензия это предусматривает.

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

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

Вы теперь можете добавить язык или изменить текущие переводы самостоятельно. Как это сделать, описано .

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

Добавили возможность .

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

Web Adapter
лучшего кадра
разделе локализации
черным списком
API
веб-интерфейс
конфигурационному параметру
здесь
Добавили параметры
Установка модулей Oz
Сервер лицензий
Свяжитесь с нами
Передайте нам
стационарный установщик
API Lite
режим
отсюда
здесь
здесь
Angular
React
Настройки файла конфигурации
Настройка Web Adapter через переменные окружения
Настройка сервера через переменные окружения
Коллекции Postman
Примерах использования
здесь
email
этой статьей
лицензирование
LicenseSource
LicenseSource
Connection
Connection
OZLivenessDelegate
OzVerificationMovement
OzVerificationMovement
OzMedia
OZMedia
OZLocalizationCode
UploadMediaSettings
OzMedia
OZVerificationStatus
OZMedia
RequestStatus
RequestResult
GeometryType
OZVerificationMovement
MediaType
OzMedia
AnalysisType
AnalysisMode
SizeReductionStrategy
OzMedia
ScenarioState
AnalysisStatus
AnalysisResolutionStatus
OZMedia
AnalysisResolutionStatus
AnalysisResult
AnalysisResolutionStatus
AnalysisType
AnalysisMode
ResultMedia
AnalyseResolutionStatus
AnalysisType
настраивать
Список актуальных тегов
Список актуальных тегов
Active Liveness
здесь
Android
iOS
настройками
Logooz-forensics / oz-liveness-androidGitLab
через веб-консоль
LogoFiles · main · oz-forensics / Oz Forensics Public projects / oz-liveness-ios-sampleGitLab
LogoOz Api scheme
телеметрии
телеметрии

Удаленный метод

Замена

OzLivenessSDK.uploadMediaAndAnalyze

AnalysisRequest.run

OzLivenessSDK.uploadMedia

AnalysisRequest.Builder.uploadMedia

OzLivenessSDK.runOnDeviceBiometryAnalysis

AnalysisRequest.run

OzLivenessSDK.runOnDeviceLivenessAnalysis

AnalysisRequest.run

AnalysisRequest.build(): AnalysisRequest

-

AnalysisRequest.Builder.addMedia

AnalysisRequest.Builder.uploadMedia

    implementation 'com.ozforensics.liveness:on-device:6.3.4'
val mediaList: List<OzAbstractMedia> = ...
val biometryAnalysisResult: OzAnalysisResult = OzLivenessSDK.runOnDeviceBiometryAnalysis(mediaList)
val livenessAnalysisResult: OzAnalysisResult = OzLivenessSDK.runOnDeviceLivenessAnalysis(mediaList)

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

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

<script src="/plugin_liveness.php"></script>
Для версий до 1.4.0

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

<link rel="stylesheet" href="https:///plugin/ozliveness.css" />
<script src="https:///plugin_liveness.php"></script>

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

авторизации
авторизационный токен
Авторизационный токен
здесь
disableFramesCountValidation
менять
заменить
набор настроек
анимации подсказки
здесь
здесь
здесь
список настроек кастомизации SDK

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

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

OZSDK.setApiConnection(Connection.fromServiceToken(host: "https://sandbox.ohio.ozforensics.com", token: token)) { (token, error) in
}

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

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

OZSDK.setApiConnection(Connection.fromCredentials(host: “https://sandbox.ohio.ozforensics.com”, login: login, password: p)) { (token, error) in
    // Ваш код для обработки ошибки или токена
}

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

let eventsConnection = Connection.fromCredentials(host: https://tm.ozforensics.com/,
                                login: <your_telemetry_user_eg_tm@company.com>,
                                password: your_telemetry_password)
OZSDK.setEventsConnection(eventsConnection) { (token, error) in
}

Съемка видео

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

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

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

extension viewController: OZLivenessDelegate {
 func onError(status: OZVerificationStatus?) {
        //показать ошибку
   }
 }
 func onOZLivenessResult(mediaToAnalyze: [OZMedia]) {
   //Перейти к выполнению проверки
 }
}

Если наш SDK используется только для съемки, пропустите шаг "Выполнение проверок".

Если пользователь прервет запись видео (закроет экран), появится ошибка failedBecauseUserCancelled.

Запуск плагина

Перед запуском убедитесь, что скрипты плагина загружены.

Для запуска окна плагина следует воспользоваться методом open(options). Параметры:

  • options – объект с настройками:

    • token – (опционально) токен авторизации;

    • license – объект с информацией о лицензии;

    • licenseUrl – строка, содержащая путь к файлу лицензии;

    • lang – строка с идентификатором одного из подключенных языковых пакетов;

    • params – объект с идентификаторами и значениями дополнительных параметров:

    • 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_error – callback-функция с одним аргументом, вызываемая при ошибке во время съемки и возвращающая информацию об ошибке: код ошибки, сообщение, идентификатор телеметрии для журналирования.

    • on_close – callback-функция без аргументов, вызываемая по окончании проверки после закрытия окна плагина, как ручного, так и автоматического.

    • device_id – (опционально) идентификатор используемой камеры.

    • 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 (мс).

Пример:

OzLiveness.open({
    lang: 'en',
    action: [
        'video_selfie_blank',
    ],
    meta: { // если нужно, добавьте метаданные для папки
        'transaction_id': 'your unique transaction identifier', // идентификатор транзакции для поиска через Oz API
        'client_id': 'your client_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);
    }
});

Для авторизации в Oz API используйте адрес API и , как показано ниже.

По умолчанию логи сохраняются вместе с данными по анализам. Если вы планируете хранить логи отдельно от этих данных, настройте отдельное подключение для :

action– перечень при записи видео.

Метод возвращает результаты съемки в виде массива объектов[], которые используются на следующем шаге для выполнения проверок.

meta – объект, ключи которого являются названиями метаполей, а значения – их строковыми значениями. передаются в Oz API и могут быть использованы для получения результатов анализа или поиска;

extract_best_shot: 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. Описание результата .

style – раздел для .

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 игнорируется.

токен доступа
Метаданные
Quality
режиме capture
настройки
здесь
настройки
здесь
настройки интерфейса
настройках конфигурации адаптера
файле конфигурации Web Adapter
телеметрии
действий пользователя
OZMedia
здесь

Лицензирование без использования сервера

Для выпуска лицензии потребуется информация о доменных именах сайтов, где будет использоваться 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 система будет проверять валидность лицензии.

Рекомендации по безопасности

Получение и обработка результатов анализа на бэкенде

Результаты анализа доступны клиентскому приложению через функции-коллбэки Web Plugin, однако мы рекомендуем получать их через бэкенд напрямую от Oz API и там же обрабатывать впоследствии. Таким образом исключается вероятность манипуляций с результатами анализов через контекст браузера.

Чтобы найти нужную папку со стороны бэкенда, сделайте следующее:

  1. На фронтенде добавьте уникальный идентификатор папки через метаданные:

    OzLiveness.open({
      ...
      meta: { 
      // идентификатор пользователя или лида из стороннего лидогенератора
      // передавайте ID, если вам нужно отслеживать несколько попыток от одного и того же пользователя
        'user_id': '<user_or_lead_id>',
      // уникальный идентификатор попытки
        'transaction_id': '<unique_id1>'
      }
    });

    Вы можете добавить собственные пары ключ-значение для хранения любой текстовой информации, например, номера документа или телефона. Однако удостоверьтесь при этом, что соблюдаются нормы законодательства о защите персональной информации.

  2. Для оповещения о завершении анализа используйте функцию-коллбэк on_result, затем вызовите бэкенд и передайте значение transaction_id.

  3. На стороне бэкенда найдите папку по присвоенному ранее идентификатору с помощью метода Folder LIST:

    /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)
  4. В ответе придут результаты анализов и идентификатор папки folder_id - он потребуется для дальнейших действий.

Ограничение объема данных, которые сервер отправляет Web Plugin

"result_mode": "safe"

Web Adapter отправляет Web Plugin данные с различным уровнем детализации. Для продакшна рекомендуется установить минимальный уровень. Для этого в Web Adapter установите параметру result_mode значение "safe".

файле конфигурации
7KB
Oz API Check with No Front End.postman_collection.json
301KB
OZ-Forensic 5.2.0-.postman_collection.json
299KB
OZ-Forensic 5.0.0.postman_collection.json
298KB
OZ-Forensic 4.0.0.postman_collection_v4.json
168KB
OZ-Forensic 3.33.0.postman_collection.json
11KB
Oz API Lite 1.2.0.json
8KB
Oz API Lite 1.1.1.postman_collection.json
2KB
privateKey.txt
1KB
privateKey.der
451B
publicKey.pub
15KB
Oz_SDK_Android_Strings.zip
archive
2KB
privateKey.txt
1KB
private_key.der
451B
publicKey.pub
12KB
Oz_SDK_iOS_Strings.zip
archive
100KB
on_complete_full.json
Пример
6KB
Face Matching with a Reference Photo.postman_collection.json
30KB
Web SDK Strings 1.6.0. RU.zip
archive
Postman
авторизация
iBeta Level 1
iBeta Level 2