Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
В этом разделе описано, как выполнять проверки в рамках основных сценариев использования.
Liveness – проверка «живости», того, что человек, снятый на видео, действительно живой реальный человек в сознании.
Биометрия – сравнение двух или более лиц с различных фотографий или видеороликов с целью ценить степень их схожести (один и тот же это человек или разные люди).
Лучший кадр – выбор лучшего кадра из видеоролика для использования его в бизнес-процессах как результата Liveness-проверки, «видео в виде картинки».
Проверка по ЧС (черному списку) – проверка, присутствует ли человек, чье фото или видео загружается в систему, в базе заранее загруженных фотографий.
Руководство по интеграции и настройке решений Oz Forensics
В этом разделе описаны API- и SDK-компоненты биометрической системы Oz Forensics. API – бэкенд, компонент, отвечающий за взаимодействие всех модулей системы. SDK – «внешняя часть», с помощью которой:
1) ведется съемка видеороликов или изображений, которые затем обрабатываются API,
2) демонстрируется результат обработки.
У нашего API существует две версии, использоваться можно любую в зависимости от ваших потребностей.
Полная версия соответствует полнофункциональному API.
Версия Lite – упрощенная, более легкая в использовании версия, в которой содержится только самое необходимое.
Мы также предоставляем SDK для вебсайтов и мобильных устройств.
Web SDK – модуль съемки и отправки медиаданных на анализы из веб-браузера. Он состоит из встраиваемого плагина и адаптера к этому плагину.
SDK для мобильных устройств включает в себя версии для iOs и Android.
Oz Mobile SDK – Software Developer’s Kit системы Oz Forensics, обеспечивающий удобную интеграцию с мобильными приложениями для регистрации и биометрической идентификации клиентов.
В этом разделе вы найдете описание SDK для десктопных и мобильных устройств.
Вебхуки (webhook) упрощают процесс получения результатов анализов. После запуска анализов не нужно инициировать опрос с проверкой, завершены ли анализы. Вместо этого в запросе на анализы добавьте вебхук, который обратится к вашему веб-сайту, когда результаты будут готовы.
При создании папки добавьте нужный веб-адрес (resolution_endpoint) в раздел payload в теле запроса:
Каждый раз, когда анализы для этой папки будут готовы, вам будет приходить уведомление. Вебхук-запрос будет содержать результаты анализов и информацию о папке, для которой они выполнялись.
Для работы с Oz API Lite вы можете использовать свободно распространяемое ПО Postman. Скачайте клиентскую часть Postman по и установите ПО.
Загрузите JSON-файл с коллекцией Postman:
После запуска клиента необходимо импортировать актуальную коллекцию для Postman, для этого в клиенте нажмите кнопку Import:
Нажмите files для выбора файла, найдите нужный JSON и нажмите Открыть:
Импортированная коллекция со всеми методами взаимодействия появится в интерфейсе Postman:
В этом разделе вы найдете описание API.
Биометрический алгоритм позволяет сравнить несколько фотографий и оценить уровень схожести людей на них. В качестве источников проверки можно передавать фото, видео и документы (с фото).
Порядок действий:
.
.
3. .
Сохраните analyse_id из ответа.
4а. Через некоторое время .
Дождитесь, когда поля resolution_status и resolution изменят статус на любой, кроме PROCESSING, – этот статус и будет результатом.
4б. Еще один вариант: добавьте , который обратится к вашему сайту по завершении анализа. В payload запроса добавьте нужный адрес в поле resolution_endpoint:
В запросе вебхука будет содержаться информация о папке и связанных с ней анализах.
Подробно статусы анализов описаны .
Алгоритм "лучший кадр" выбирает из видеозаписи наиболее качественный и удачный кадр с лицом. Алгоритм вызывается дополнительно к анализу .
Порядок действий:
.
3. . Убедитесь, что параметр "extract_best_shot" имеет значение True, как показано ниже.
В source_media указывается media_id из ответа предыдущего запроса. Это опционально, если требуется проверить одно из двух заранее загруженных в папку видео.
Сохраните analyse_id из ответа.
4а. Через некоторое время п. Дождитесь, когда поля resolution_status и resolution изменят статус на любой, кроме PROCESSING, – этот статус и будет результатом.
4б. Еще один вариант: добавьте , который обратится к вашему сайту по завершении анализа. В payload запроса добавьте нужный адрес в поле resolution_endpoint:
В запросе вебхука будет содержаться информация о папке и связанных с ней анализах.
Подробно статусы анализов описаны .
5. Лучший кадр можно получить из ответа results_media -> output_images -> original_url
Oz API является центральным компонентом системы, который связывает между собой все остальные компоненты. В том числе:
предоставляет единый Rest API для запуска Liveness и Biometry анализов
проводит и
ведет базу запросов и выполненных анализов
архивирует входящие медиаданные
собирает телеметрию с подключенных мобильных приложений
предоставляет возможность настроить специфичные модели устройств
генерирует подробные отчеты о результатах выполнения анализов
Описание основных методов Rest API схемы:
Коллекция Postman, включающая в себя все имеющиеся на данный момент методы:
{
"media:tags": {
"video1": [
"video_selfie",
"video_selfie_scan",
"orientation_portrait"
],
"photo1": [
"photo_selfie"
],
"doc1": [
"photo_id",
"photo_id_front"
]
}
}{
"analyses": [{
"type": "biometry",
// необязательный параметр
// если не указать, анализ будет назначен на все медиафайлы в папке
"source_media": [
"1111aaaa-11aa-11aa-11aa-111111aaaaaa",
"2222bbbb-22bb-22bb-22bb-222222bbbbbb"
]
}]
}{
"resolution_endpoint": "address.com",
{
.... // информация о папке и т.д.
}
}{
"media:tags": {
"video1": [
"video_selfie",
"video_selfie_scan",
"orientation_portrait"
]
}
}{
"analyses": [{
"type": "quality",
"source_media": ["6187a4ef-62c4-4445-bbb2-bf62d61f1fde"],
"params" : {
"extract_best_shot": true
}
}]
}{
"resolution_endpoint": "address.com",
{
.... // информация о папке и т.д.
}
}{
"resolution_endpoint": "address.com", // укажите нужный адрес здесь
... // остальные детали запроса
}



Определение живости
Алгоритм определения живости предназначен для проверки наличия живого человека по короткому видео фрагменту.
Порядок действий:
{
"media:tags": {
"video1": [
"video_selfie",
"video_selfie_scan",
"orientation_portrait"
]
}
}3. Запустите анализ.
{
"analyses": [{
"type": "quality",
"source_media": ["6187a4ef-62c4-4445-bbb2-bf62d61f1fde"],
}]
}В source_media указывается media_id из ответа предыдущего запроса. Это опционально, если требуется проверить одно из двух заранее загруженных в папку видео.
Сохраните analyse_id из ответа.
4а. Через некоторое время проверьте результат.
Дождитесь, когда поля resolution_status и resolution изменят статус на любой, кроме PROCESSING, – этот статус и будет результатом.
4б. Еще один вариант: добавьте вебхук, который обратится к вашему сайту по завершении анализа. В payload запроса добавьте нужный адрес в поле resolution_endpoint:
{
"resolution_endpoint": "address.com",
{
.... // информация о папке и т.д.
}
}В запросе вебхука будет содержаться информация о папке и связанных с ней анализах.
Подробно статусы анализов описаны здесь.
Здесь вы узнаете, как через API получить результаты выполненных анализов.
Результат любого анализа представляет собой число. Для анализа Biometry это число отражает степень совпадения/несовпадения лиц в загруженных вами медиафайлах по сравнению с референсами – теми файлами, которые хранятся в базе. Для анализа Liveness – возможность того, что на загруженном медиафайле не реальный живой человек в сознании, а какое-то его изображение или deepfake. Результаты анализов можно узнать и без захода в каждую заявку по отдельности – API предоставляет возможность извлечь их из JSON-ответа.
Сделайте запрос к заявке или списку заявок. Параметр with_analyses должен быть установленTrue.
Для типа анализа Biometry ищите значение параметра min_confidence:
"items":
[
{
"analyses":
[
{
"analyse_id": "biometry_analysis_id"
"folder_id": "some_folder_id",
"type": "BIOMETRY",
"state": "FINISHED",
"results_data":
{
"max_confidence": 0.997926354,
"min_confidence": 0.997926354
}Этот параметр отражает уверенность системы в том, что на представленных медиа фигурирует один и тот же человек.
4. Для типа анализа Liveness Analysis ищите значение параметра confidence_spoofing для нужного медиафайла:
"items":
[
{
"analyses":
[
{
"source_media":
[
{
"media_id": "your_media_id",
"media_type": "VIDEO_FOLDER",
}
]
"results_media":
[
"analyse_id": "liveness_analysis_id",
"results_data":
{
"confidence_spoofing": 0.55790174
}Этот параметр показывает вероятность спуфинг-атаки – того, что на полученном видео, например, использовалась технология deepfake или вместо человека программе показали видеоролик с этим человеком.
Если нужно обработать несколько результатов анализов, запросите список заявок и сделайте парсинг JSON-ответа.
Алгоритм проверки по черному списку предназначен для проверки присутствия человека по базе заранее загруженных фотографий. В качестве источника для сравнения можно использовать изображение и/или фрагмент видео.
Порядок действий описан ниже.
1. Авторизуйтесь. Параметры передаются в json-запросе в составе credentials. См. статьи Коллекции Postman и Аутентификация.
2. Поместите видеофайл в папку, как описано здесь.
Пример заполнения payload для видео:
{
"media:tags": {
"video1": [
"video_selfie",
"video_selfie_scan",
"orientation_portrait"
]
}
}3. Запустите анализ: POST/api/folders/{{folder_id}}/analyses/
В типе анализа должно быть указано collection.
{
"analyses": [{
"type": "collection",
"source_media": ["идентификатор_медиафайла_источника"],
}]
}В source_media указывается media_id из ответа предыдущего запроса. Это опционально, если требуется проверить одно из двух заранее загруженных в папку видео.
Сохраните analyse_id из ответа.
4а. Через некоторое время проверьте результат. Дождитесь, когда поля resolution_status и resolution изменят статус на любой, кроме PROCESSING, – этот статус и будет результатом.
4б. Еще один вариант: добавьте вебхук, который обратится к вашему сайту по завершении анализа. В payload запроса добавьте нужный адрес в поле resolution_endpoint:
{
"resolution_endpoint": "address.com",
{
.... // информация о папке и т.д.
}
}В запросе вебхука будет содержаться информация о папке и связанных с ней анализах.
Подробно статусы анализов описаны здесь.
Если вы хотите узнать, с кем именно из вашей базы фотографий совпало лицо с медиафайла, который вы только что загрузили, найдите в ответе анализ collection, в нем results_media, где и будет идентификатор нужной вам персоны person_id. Чтобы получить информацию об этой персоне, вызовите метод GET /api/collections/{{collection_id}}/persons/{{person_id}}, указав идентификаторы вашей коллекции и персоны в ней.
Чтобы провести анализы для ваших медиафайлов, необходимо поместить их в папку – либо существующую, либо новую, созданную с помощью Oz API. Для каждого файла необходимо указать теги: они описывают, что это за файл и какие анализы к нему применимы.
Создание папки и добавление в нее медиафайлов: POST /api/folders/
Добавление файлов в существующую папку: POST /api/folders/{{folder_id}}/media/
Файлы должны быть добавлены в теле запроса, теги – в поле payload.
Пример заполнения payload для пассивного Liveness и фотографии лицевой стороны документа:
{
"media:tags": { // здесь устанавливаются теги для загружаемых вами медиафайлов
// media files are referenced by the keys in a multipart form
"video1": [ // ключ для файла
// стандартный набор тегов для видео с пассивным Liveness
"video_selfie", // видео с лицом
"video_selfie_blank", // отсутствует
"orientation_portrait" // ориентация видео
],
"photo1": [
// стандартный набор тегов для лицевой стороны документа
"photo_id",
"photo_id_front"
]
}
}Пример использования (Postman):
В случае успеха в ответе вернется информация о папке.
В версии 6.0.1 мы добавили новый режим работы API – Instant. В этом режиме мы не сохраняем никакие данные, все, что вы отправляете и получаете, существует только в рамках вашего запроса и ответа на него. Таким образом вы экономите место в хранилище и, что может быть особенно важно в рамках соблюдения требований законодательства, не передаете и не храните чувствительные данные.
Чтобы включить режим Instant API, при подготовке файла конфигурации (config.py) для API установите параметру OZ_APP_COMPONENTS значение stateless. Чтобы никакие данные запроса и ответа не сохранялись, отправьте следующий запрос: POST /api/instant/folders/ . Авторизация настраивается на вашей стороне.
При использовании Instant API с Web SDK при установите параметру architecture значение lite. Версия Web SDK должна быть не ниже 1.7.14.
CPU: 16 ядер, 32 потока, базовая частота – 2.3 GHz, максимальная частота в турборежиме для одного ядра – 4 GHz.
RAM: 32 GB, DDR 5, Dual Channel.
Для расчета RPS и RPM и подбора оптимальной конфигурации под ваши задачи обратитесь к нам.
Перед запуском подготовьте файл конфигурации со следующими параметрами.
Без этих параметров Instant API не запустится.
Список методов доступен по . Также вы можете скачать коллекцию для Postman:
С выходом API 6.0 мы прекращаем развивать и поддерживать API Lite.
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 с детальной информацией по ним вы можете найти .
# список компонентов Oz API. Для Instant API укажите stateless
# для компонента авторизации добавьте auth
OZ_APP_COMPONENTS=stateless
# поддержка локального хранилища
OZ_LOCAL_STORAGE_SUPPORT_ENABLE=false
# адрес сервиса tfss
OZ_SERVICE_TFSS_HOST=http://xxx.xxx.xxx.xxx:xxxx
# разрешенные хосты
APP_ALLOWED_HOSTS=example-host1.com,example-host2.com
# секретный ключ
OZ_API_SECRET_KEY=long_secret_keyCONTAINER_NAME=<container name> \
DEPLOY_INSTANT_PORT_EXT=<external port> \
INSTANT_IMAGE=<provided image name> \
ADDITIONAL_PARAMS="-e LICENSE_KEY=<your license key>" \
docker run -d --name $CONTAINER_NAME
$ADDITIONAL_PARAMS
-p ${DEPLOY_INSTANT_PORT_EXT}:8080
$INSTANT_IMAGEservices:
oz-api-instant:
image: <provided image>
container_name: oz-api-instant
environment:
- LICENSE_KEY=<your license key>
# - TF_ENABLE_ONEDNN_OPTS=1 # In some cases, especially for AMD CPUs, set to 0
# - API_LISTEN_PORT=8080
# - LOG_LEVEL=info # ['critical', 'error', 'warning', 'info', 'debug', 'trace']
restart: always
ports:
- 8080:8080
В этой статье рассказывается, как создать коллекцию методами API, как добавить в нее персону и фотографии, как потом все это удалить, а также удалить саму коллекцию. Все это можно также сделать через веб-консоль, однако здесь мы описываем только соответствующие методы API.
Коллекция в Oz API – это база фотографий лиц (персон), которые используются в анализе Blacklist для сравнения с лицом человека с только что снятого фото или видео.
Персона – это сущность в коллекции, соответствующая одному человеку. Для одной персоны может быть загружено несколько фотографий.
Коллекция создается в рамках определенной компании, таким образом, для добавления новой коллекции необходим идентификатор компании company_id.
Если вы его не знаете, найдите компанию поиском с помощью метода GET /api/companies/?search_text=test, где test – наименование компании или его часть. Сохраните полученный company_id.
Для создания коллекции вызовите метод POST /api/collections/. В теле запроса укажите название своей коллекции (alias) и company_id нужной компании, как показано ниже:
{
"alias": "blacklist",
"company_id": "your_company_id"
}В ответе на запрос будет идентификатор коллекции collection_id. Он понадобится на следующем шаге.
Для добавления новой персоны в коллекцию вызовите метод POST /api/collections/{{collection_id}}/persons/, где collection_id – идентификатор коллекции из предыдущего шага. В запросе передайте фото персоны (или несколько фото). В Payload укажите соответствующие фото теги, как показано ниже.
{
"media:tags": {
"image1": [
"photo_selfie",
"orientation_portrait"
]
}
}В ответе вам придет идентификатор персоны person_id - это идентификатор отдельного человека в коллекции.
В этом же запросе через payload можно добавить данные о персоне:
"person:meta_data": {
"person_info": {
"first_name": "John",
"middle_name": "Jameson",
"last_name": "Doe"
}
},Вы также можете загрузить дополнительные фото персоны после ее добавления: используйте метод POST {{host}}/api/collections/{{collection_id}}/persons/{{person_id}}/images/ с соответствующим person_id. Тело запроса заполните так же, как для метода POST /api/collections/{{collection_id}}/persons/.
Чтобы получить информацию о всех персонах в коллекции, вызовите метод GET /api/collections/{{collection_id}}/persons/.
Если вам нужен список фотографий для отдельной персоны, воспользуйтесь методом GET /api/collections/{{collection_id}}/persons/{{person_id}}/images/. Обратите внимание: для каждого фото будет указан идентификатор фото person_image_id – он потребуется вам, например, для удаления фото.
Чтобы удалить персону со всеми соответствующими ей фотографиями, используйте метод DELETE /api/collections/{{collection_id}}/persons/{{person_id}}, указав идентификаторы коллекции и персоны. Все фото этой персоны удалятся автоматически. Персону нельзя удалить, если с ней связаны анализы – то есть если эта персона участвовала в анализе Black list и с ней были найдены совпадения. Для удаления такой персоны сперва нужно удалить соответствующие анализы методом DELETE /api/analyses/{{analyse_id}} (потребуется analyse_id анализа collection (Black list)).
Для удаления всех связанных с коллекцией анализов запросите список всех папок с анализом Black list: call GET /api/folders/?analyse.type=COLLECTION. Для каждой папки из списка (GET /api/folders/{{folder_id}}/), найдите analyse_id нужного анализа, а затем удалите анализ – DELETE /api/analyses/{{analyse_id}}.
Для удаления определенной фотографии той или иной персоны вызовите метод DELETE /api/collections/{{collection_id}}/persons/{{person_id}}/images/{{person_image_id}} и укажите идентификаторы коллекции, персоны, фотографии.
Перед удалением коллекции нужно удалить информацию о всех входящих в нее персонах, а затем стереть саму коллекцию с помощью метода DELETE /api/collections/{{collection_id}}/.
При создании какого-либо объекта системы у вас может возникнуть необходимость хранить для него дополнительные данные, те, которые отсутствуют в базовом списке его параметров. Такие данные называются метаданными. Вы можете хранить любую нужную вам информацию в разделе meta_data в приведенном ниже формате ("название поля": "соответствующие полю данные"):
…
meta_data:
{
"field1": "value1",
"field2": "value2"
}
…Метаданные можно добавить к большинству объектов системы. Список объектов с соответствующими им методами для добавления метаданных приведен ниже. Также метаданные можно указать при создании объекта.
Объект
Метод API
Пользователь
PATCH /api/users/{{user_id}}
Папка (заявка)
PATCH /api/folders/{{folder_id}}/meta_data/
Медиафайл
PATCH /api/media/{{media_id}}/meta_data
Анализ
PATCH /api/analyses/{{analyse_id}}/meta_data
Коллекция
PATCH /api/collections/{{collection_id}}/meta_data/
and, for a person in a collection,
PATCH /api/collections/{{collection_id}}/persons/{{person_id}}/meta_data
Метаданные можно также и менять, и удалять. Все нужные методы описаны в нашей документации по API.
Метаданные могут вам потребоваться, например, если вы захотите группировать папки (заявки) по людям или лидам. Например, для подсчета конверсии в случаях, когда один лид делает несколько попыток пройти анализ Liveness, добавьте идентификатор этого лида в метаданные соответствующих папок.
Чтобы добавить идентификатор клиента iin к объекту папки, в тело запроса внесите соответствующую запись:
{
"iin": "123123123"
}Еще один частый случай использования метаданных связан с безопасностью: вы обрабатываете результат анализа на своем бэкенде, но не хотите при этом использовать идентификатор папки при обращении к ней. Добавьте отдельный идентификатор (transaction_id) в метаданные папки, и вы сможете искать нужную информацию по нему. Подробно этот случай использования описан здесь.
Если вы храните в метаданных персональные данные, убедитесь, что при этом не нарушаются соответствующие законы.
Метаданные можно также добавить через SDK, а затем работать с ними с помощью методов API. Добавление метаданных через SDK описано в соответствующих разделах:
Исправили ошибку, иногда возникавшую при генерации параметров time_created и folder_id метода Detect.
Обновления безопасности.
Обновили модели.
С помощью метода Liveness detect теперь можно отправить не более 10 файлов в одном запросе, при этом размер каждого файла не должен превышать 15 МБайт.
Обновили список жестов, которые поддерживают отправку лучшего кадра (best_shot): включили повороты, наклон и подъем головы, а также улыбку и моргание.
Обновили метод Liveness detect: теперь он работает также и с видео и архивами.
API Lite теперь работает и с base64
Улучшили биометрическую модель
Добавили режим 1:N
Добавили политику CORS
Подготовили первую версию документации
Переработали сообщения об ошибках, теперь они более информативны
Упростили операции Liveness/Detect
Переработали ядро
Добавили операции для защиты от спуфинга
Добавили операцию extract_and_compare
Как получить и обновить токены доступа.
Чтобы получить токены доступа, нужно выполнить POST-запрос на /authorize/auth/. В теле запроса нужно указать полученные от нас электронную почту и пароль в составе credentials, а также API-адрес в качестве адреса хоста.
Body
{
"credentials": {
"email": "{{user_email}}",
"password": "{{user_password}}"
}
}Результатом аутентификации пользователя является пара access_token и expire_token.
access_token – ключ (набор символов), предъявление которого является пропуском к ресурсам системы. Обращение к ним происходит с указанием в заголовках полученного access_token.
headers = {‘ X-Forensic-Access-Token’: <access_token>}
Действие access_token ограничено во времени и регулируется настройками:
для сервисных учетных записей – OZ_SESSION_LONGLIVE_TTL (по умолчанию 5 лет),
для всех остальных – OZ_SESSION_TTL (по умолчанию 15 минут).
expire_token предназначен для обновления пары access_token и expire_token.
если expire_date > текущей даты, то expire_date сессии устанавливается в значение текущей даты + временная дельта настроек, описанных выше.
Чтобы обновить пару access_token и expire_token, нужно выполнить POST-запрос на адрес authorize/refresh/ c expire_token в теле запроса и X-Forensic-Access-Token в заголовках.
{
"expire_token": "{{expire_token}}"
}Положительным результатом будет ответ с новой парой access_token и expire_token.
Предыдущая пара access_token и expire_token будет удалена из базы данных при первой аутентификации по новой паре access_token и expire_token.
Код ошибки
Сообщение об ошибке
Причина
400
Could not locate field for key_path expire_token from provided dict data
expire_token отсутствует в теле запроса.
401
Session not found
Не существует сессии с переданным expire_token.
403
You have not access to refresh this session
Пользователь, который делает запрос, не является владельцем сессии переданного expire_token.
Работа с OZ Mobile SDK в операционной системе «Android»
Чтобы начать пользоваться нашим SDK, нужно выполнить следующие шаги.
Добавьте SDK в проект, как описано здесь.
Получите лицензию на SDK – сгенерируйте тестовую самостоятельно на нашем сайте или запросите «боевую» по электронной почте. Для лицензии потребуется application id. Добавьте лицензию в проект, как описано здесь.
Подключите SDK к API. Это необязательный шаг, он выполняется, только если вам нужно обрабатывать какие-либо данные на сервере.
Для съемки видео используйте методы, описанные здесь – вы получите медиафайлы, которые потом можно будет отправить на анализ.
Запустите нужные вам проверки для полученных на предыдущем шаге медиафайлов. Здесь описано, как выполнять проверки.
Если вы хотите настроить внешний вид SDK, здесь написано, как это делается.
Рекомендуемая версия Android: 5+ (чем новее смартфон, тем быстрее выполняются анализы).
Рекомендуемые версии компонентов:
Версия Gradle
7.5.1
Версия Kotlin
1.7.21
Версия AGP
7.3.1
Java Target Level
1.8
Версия JDK
17
Мы не поддерживаем эмуляторы.
Доступные языки: EN, RU, ES, HY, KK, KY, TR.
Исходные коды примеров приложений с использованием Oz Liveness SDK расположены в репозитории GitLab:
Список методов и полей SDK:
Актуальную сборку демо-приложения Вы можете загрузить по ссылке.
Каждый загружаемый медиафайл требуется маркировать специальными тегами. Это необходимо для корректной работы алгоритмов распознавания. Теги для видео и фото отличаются друг от друга.
Для видеофайлов в Системе должны быть указаны следующие типы тегов:
Тег, определяющий тип данных «видео»:
video_selfie
Тег, определяющий ориентацию видео:
orientation_portrait – портретная ориентация;
orientation_landscape – ландшафтная ориентация.
Тег, определяющий действие на видео:
video_selfie_left – поворот головы налево;
video_selfie_right – поворот головы направо;
video_selfie_down – наклон головы вниз;
video_selfie_high – наклон головы вверх;
video_selfie_smile – улыбка;
video_selfie_eyes – моргание;
video_selfie_scan – сканирование;
video_selfie_oneshot – анализ по одному кадру;
video_selfie_blank – нет действия.
Алгоритмы распознают файлы с тегами из этого списка как подходящие для выполнения анализов (Liveness) и .
Важно: в версии API 4.0.8 или старше, чтобы отправить на анализ Quality (Liveness) изображение, а не видео, необходимо поместить его в архив .zip, установить тип файла SHOTS_SET и поставить один из тегов video_, иначе Quality изображение проигнорирует.
Пример корректного набора тегов видеофайла с действием «моргание»:
Для фотофайлов в Системе должны быть указаны следующие типы тегов:
Тег для селфи:
photo_selfie – тег, определяющий тип фотографии «селфи»
Теги для фотографий или сканов удостоверений личности:
photo_id – тег, определяющий тип фотографии «документы»;
photo_id_front – фото лицевой стороны документа;
photo_id_back – фото обратной стороны документа (любые другие анализы, кроме Документов, файлы с этим тегом игнорируют).
Важно: в версии API 4.0.8 или старше, чтобы отправить на анализ Quality (Liveness) изображение, а не видео, необходимо поместить его в архив .zip, установить тип файла SHOTS_SET и поставить один из тегов video_, иначе Quality изображение проигнорирует.
Пример корректного набора тегов фотофайла «селфи»:
Пример корректного набора тегов фотофайла с лицевой стороной документа:
Пример корректного набора тегов фотофайла с обратной стороной документа:
Виды и назначение биометрических анализов медиаданных в Oz Api, как интерпретировать результат.
В Oz Api существует несколько видов анализов:
,
,
,
.
Возможные качественные результаты анализов описаны здесь: .
У каждого из анализов есть пороговое значение, определяющее статус анализа на выходе. По умолчанию этот порог равен 0.5 или 50%, для Blacklist и Biometry (Face Matching) – 0.85 или 85%.
Biometry: значение не ниже порога означает, что лица совпадают.
Blacklist: значение не ниже порога означает, что лицо с проанализированного медиафайла совпало с одним из лиц в черном списке.
Quality: значение не ниже порога означает наличие атаки.
Чтобы настроить пороговое значение под ваши нужды, .
Больше информации по интерпретации численных результатов анализов вы можете найти здесь: .
Биометрический алгоритм позволяет сравнить несколько фото и оценить уровень схожести запечатленных на них людей. В качестве источников проверки можно передавать фото, видео и страницы документов с фото. Для корректной работы нужно как минимум 2 файла-источника (подробности смотрите на странице ).
Анализ выдает уровень схожести изображений лиц в процентах от 100 до 0% (1->0), где:
100% (1) – максимальная схожесть,
0% (0) – схожесть отсутствует.
Алгоритм определения живости Liveness (анализ Quality) предназначен для проверки наличия живого человека в коротком видеоролике или на фото.
Алгоритм "лучший кадр" (best shot) выбирает из видеозаписи наиболее качественный и удачный кадр с лицом. Алгоритм вызывается дополнительно к анализу .
Анализ выдает возможность спуфинга*/атаки в процентах, где:
100% (1) – атака, перед камерой не живой человек,
0% (0) – перед камерой реальный человек в сознании.
*Спуфинг в биометрической области – (англ. spoofing – подмена) это ситуация, в которой человек маскируется под другого человека, используя программные и не программные средства (виртуальная камера, демонстрация изображения лица с экрана смартфона или фотографии, маски или силиконовой головы).
Анализ распознавания и проверки документов предназначен для базового определения наличия документа в кадре и проверки корректности полей документа согласно его типу. Параллельно проводится биометрический анализ (сверка фотографии из документа и селфи, сделанного человеком).
Анализ документов выдает два варианта результатов:
Документы успешно проверены,
Документы не прошли проверку.
Также выводится набор полей документа с результатами распознавания по каждому полю и результат биометрического анализа.
Алгоритм проверки по черному списку предназначен для проверки присутствия человека в базе заранее загруженных фото.
База заранее загруженных фото может называться как "Черным списком", если туда внесены фотографии лиц мошенников или других нежелательных для бизнеса людей, так и "Белым списком", если она содержит фотографии лиц VIP-персон.
Анализ по черному списку выдает процент схожести от 100 до 0% (1->0), где:
100% (1) – это максимальная схожесть, алгоритм нашел совпадения с изображениями из черного списка.
0% (0) – минимальная схожесть, алгоритм не нашел совпадений с изображениями из черного списка.
В версии 6.0.1 мы добавили возможность отправить все необходимые для анализа данные и получить результат с помощью единственного запроса. До этого взаимодействие с API требовало последовательной отправки нескольких запросов: на , затем на назначение анализов (, , ), после этого – на получение результата (поллинг или ). Если вам нужны отдельные запросы, вы можете работать таким образом и дальше, но теперь есть и упрощенный способ: все это можно сделать одним запросом, включающим в себя все вышеуказанное.
Вся информация отправляется в одном запросе, снижая вероятность потери по пути части данных.
Синхронная работа – как только анализ завершится, вы получите результат, не нужно опрашивать сервер о готовности или настраивать вебхуки.
Высокая производительность – до 36 анализов в минуту на один сервер.
Чтобы отправить медиафайлы на анализ одним запросом, вызовите метод POST /api/folders/. В заголовке X-Forensic-Access-Token передайте ваш . Добавьте в тело запроса нужные медиафайлы, а в payload – соответствующие им теги и, если нужно, метаданные.
В ответе вам придут результаты анализов.
Готово.
Сгенерируйте тестовую лицензию самостоятельно (внимание, страница на английском языке) или свяжитесь с нами по для выпуска продуктивной лицензии. Для подготовки лицензии потребуется applicationId (bundle id).
Для добавления файла лицензии в SDK вызовите метод OzLivenessSDK.init с одним из параметров LicenseSources:
LicenseSource.LicenseAssetId должен содержать путь к файлу forensics.license, расположенному в проекте в папке res/raw.
LicenseSource.LicenseFilePath должен содержать пусть к файлу на устройстве (вне проекта).
Если при обработке лицензии возникнут ошибки, вы получите сообщение с описанием этих ошибок. Если ошибок нет, система выведет данные о лицензии. Вы также можете запросить эти данные с помощью метода getLicensePayload.
"video1": [
"video_selfie",
"video_selfie_eyes",
"orientation_portrait"
] "photo1": [
"photo_selfie"
]"photo1": [
"photo_id", "photo_id_front"
]"photo1": [
"photo_id", "photo_id_back"
]{
// (необязательно) метаданные папки, если нужны
"folder:meta_data": {
"partner_side_folder_id": "00000000-0000-0000-0000-000000000000",
"person_info": {
"first_name": "John",
"middle_name": "Jameson",
"last_name": "Doe"
}
},
// (необязательно) метаданные папки, если нужны
"media:meta_data": {
"video1": {
"foo": "bar"
}
},
"media:tags": {
"video1": [
"video_selfie",
"video_selfie_eyes",
"orientation_portrait"
]
},
"analyses": [
{
"type": "quality",
// (необязательно) метаданные папки, если нужны
"meta_data": {
"example1": "some_example1"
},
// дополнительные параметры
"params": {
"threshold_spoofing": 0.5,
"extract_best_shot": false
}
}
]
}{
"company_id": "00000000-0000-0000-0000-000000000000",
"time_created": 1744017549.366616,
"folder_id": "00000000-0000-0000-0000-000000000000",
"user_id": "00000000-0000-0000-0000-000000000000",
"resolution_endpoint": null,
"resolution_status": "FINISHED",
"resolution_comment": "[]",
"system_resolution": "SUCCESS",
...
// метаданные папки, если есть
"meta_data": {
"partner_side_folder_id": "00000000-0000-0000-0000-000000000000",
"person_info": {
"first_name": "John",
"middle_name": "Jameson",
"last_name": "Doe"
}
},
"media": [
{
"company_id": "00000000-0000-0000-0000-000000000000",
"folder_id": "00000000-0000-0000-0000-000000000000",
"folder_time_created": 1744017549.366616,
"original_name": "00000000-0000-0000-0000-000000000000.mp4",
"original_url": null,
"media_id": "00000000-0000-0000-0000-000000000000",
"media_type": "VIDEO_FOLDER",
"tags": "video1": [
"video_selfie",
"video_selfie_eyes",
"orientation_portrait"
]
"info": {},
"time_created": 1744017549.368665,
"time_updated": 1744017549.36867,
// метаданные медиафайлов, если есть
"meta_data": {
"foo": "bar"
},
"thumb_url": null,
"image_id": "00000000-0000-0000-0000-000000000000"
}
],
"time_updated": 1744017549.366629,
"analyses": [
{
"company_id": "00000000-0000-0000-0000-000000000000",
"group_id": "00000000-0000-0000-0000-000000000000",
"folder_id": "00000000-0000-0000-0000-000000000000",
"folder_time_created": 1744017549.366616,
"analysis_id": "00000000-0000-0000-0000-000000000000",
"state": "FINISHED",
"resolution_operator": null,
"results_media": [
{
...
}
],
"results_data": null,
// метаданные анализа, если есть
"meta_data": {
"example1": "some_example1"
},
"time_created": 1744017549.369485,
"time_updated": 1744017550.659305,
"error_code": null,
"error_message": null,
"source_media": [
{
...
}
],
"type": "QUALITY",
"analyse_id": "00000000-0000-0000-0000-000000000000",
"resolution_status": "SUCCESS",
"resolution": "SUCCESS"
}
]
}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, как показано выше в этой статье
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) { /*обработка исключения */ }
}
);Обратите внимание: описанная ниже функциональность работает, начиная с версии 8.1.0.
Чтобы добавить или обновить языковой пакет для Oz Android SDK, сделайте следующие шаги:
Перейдите в папку для нужной локали или создайте такую папку. Детально процесс описан здесь.
Создайте файл и назовите его strings.xml.
Скопируйте строки из приложенного файла в только что созданный.
Переопределите в переводах строки, которые вам нужны.
Список переводов для Android:
Ключи вида action_*_go относятся к соответствующим жестам. Остальные – к подсказкам для всех жестов, информационным сообщениям или ошибкам.
Когда вместе с новыми версиями появляются новые ключи, если вы не переопределите соответствующие строки в вашем файле, текст для новых ключей будет показываться на английском языке.
Этот коллбэк вызывается, если в системе возникает какая-либо ошибка. Он возвращает информацию об ошибке и идентификатор телеметрии, с помощью которого можно получить дополнительные данные о причине сбоя.
on_error {
"code": "error_code",
"event_session_id": "id_of_telemetry_session_with_error",
"message": "<error decription>",
"context": {} // дополнительная информация
}
Если вы при обновлении с прежних версий (до 6.4.2 включительно) хотите сохранить привычный для клиентов дизайн, сбросьте настройки интерфейса экрана съемки до значений по умолчанию и примените следующие параметры (приведены только те параметры, которые нужно изменить):
// параметры настройки верхней панели
let toolbarCustomization = ToolbarCustomization(
closeButtonColor: .white,
backgroundColor: .black)
// параметры настройки текста подсказки
let centerHintCustomization = CenterHintCustomization(
verticalPosition: 70)
// параметры настройки анимации подсказки
let hintAnimationCustomization = HintAnimationCustomization(
hideAnimation: true)
// параметры настройки рамки вокруг лица
let faceFrameCustomization = FaceFrameCustomization(
strokeWidth: 6,
strokeFaceAlignedColor: .green,
strokeFaceNotAlignedColor: .red)
// параметры настройки фона за рамкой
let backgroundCustomization = BackgroundCustomization(
backgroundColor: .clear)
OZSDK.customization = OZCustomization(toolbarCustomization: toolbarCustomization,
centerHintCustomization: centerHintCustomization,
hintAnimationCustomization: hintAnimationCustomization,
faceFrameCustomization: faceFrameCustomization,
versionCustomization: versionCustomization,
backgroundCustomization: backgroundCustomization)Этот раздел описывает, как работать с Oz Flutter SDK для iOS и Android.
Перед началом работы мы рекомендуем установить:
Flutter версии 3.0.0 или выше;
Android SDK версии 21 или выше;
dart версии 2.18.6 или выше;
iOS версии 13 или выше;
Xcode.
Образец кода для Flutter вы можете найти здесь.
Обратите внимание: описанная ниже функциональность работает, начиная с версии 8.1.0.
Чтобы добавить или обновить языковой пакет для Oz iOS SDK, используйте метод set(languageBundle: Bundle). Он информирует SDK, что вы планируете использовать отличный от стандартного бандл. В OzLocalizationCode используйте кастомный язык (опционально).
Если вы не укажете кастомные язык и бандл, SDK будет использовать имеющиеся переводы.
Если бандл указан, а язык нет, приоритетным считается перевод для ключа из файла локализации кастомного бандла. Если такой ключ там не найден, перевод берется из стандартного бандла.
Если указаны кастомные и бандл, и язык, все переводы берутся из файла локализации кастомного бандла.
Список переводов для iOS:
Ключи вида Action.*.Task относятся к соответствующим жестам. Остальные – к подсказкам для всех жестов, информационным сообщениям или ошибкам.
При появлении новых ключей, если переводов для них в кастомном бандле нет, будет показываться текст на языке по умолчанию (английском).
В данном разделе описаны все возможные статусы анализов в API.
Ниже приведены разъяснения по каждому статусу.
Состояние выполнения анализа принимает следующие значения:
PROCESSING – в обработке;
FAILED – анализ выполнить не удалось, произошла ошибка;
FINISHED – выполнение анализа завершено.
Если выполнение анализа завершено, результат выполнения может принимать следующие значения:
SUCCESS– проверка пройдена успешно;
OPERATOR_REQUIRED (кроме анализа Liveness) – требуется (т.е. дополнительная проверка человеком);
DECLINED – проверка не пройдена (лицо не совпало или совпало с лицом из ЧС в зависимости от настроек, атака, лицо не совпало с лицом в документах).
Если анализ не завершен, результат наследует значение из analyse.state: PROCESSING (еще в обработке) / FAILED (возникли ошибки, завершить анализ не удалось).
Заявка – это папка, в которой лежат медиафайлы для анализа. Если анализы еще не завершены, в resolution_status вы увидите одно из следующих значений:
INITIAL – анализы не назначены;
PROCESSING – анализы выполняются;
FAILED – выполнить анализы не удалось (произошли ошибки);
FINISHED – папка обработана, выполнение анализов завершено.
Результат заявки – консолидированный результат всех анализов, назначенных для медиафайлов из этой папки. Обратите внимание: результат заявки представляет собой результат группы анализов, завершившейся последней. Если все назначенные анализы выполнены, результат будет:
SUCCESS– все хорошо, проверки пройдены успешно;
OPERATOR_REQUIRED (кроме анализа Liveness) – анализы со статусом DECLINED отсутствуют, но один или больше анализов завершились со статусом OPERATOR_REQUIRED;
DECLINED – один или больше анализов завершились с результатом DECLINED, то есть проверка не прошла.
Полный список запросов вы можете найти в , в приведен порядок запросов в наиболее распространенных случаях. В данной статье перечислены коды ответов на запросы и ошибки при обработке запросов.
Коды ответов в диапазоне 2XX соответствуют корректно отработавшему запросу (например, при получении данных возвращается код 200, при добавлении новой сущности – 201, при корректном удалении – 204 и так далее);
Коды ответов в диапазоне 4XX соответствуют ошибке при обработке запроса, произошедшей на стороне вызывающего клиента (например, 404 – обращение к несуществующему ресурсу);
Коды ответов в диапазоне 5XX соответствуют ошибке при обработке запроса на стороне самой системы (например, при временной недоступности базы данных).
Каждая ошибка, возникшая при обработке запроса на стороне системы, помимо соответствующего HTTP-кода ошибки содержит также описание самой ошибки в теле ответа с указанием следующих JSON-полей:
error_code – целочисленный код ошибки;
error_message– сообщение с описанием возникшей ошибки (используется только для отладочных задач и расследования инцидентов);
details – детали ошибки (приводятся в произвольном формате, специфичном для каждого отдельного типа ошибки). Необязательное поле.
Пример ответа сервера:
Коды ошибок:
Для подключения плагина на страницу необходимо добавить в html-код страницы ссылку на основной скрипт плагина (plugin_liveness.php). web-sdk-root-url – это полученная от нас ссылка на Web Adapter.
Если вы при обновлении с прежних версий (до 6.4.2 включительно) хотите сохранить привычный для клиентов дизайн, сбросьте настройки интерфейса экрана съемки до значений по умолчанию и примените следующие параметры (приведены только те параметры, которые нужно изменить):
В build.gradle проекта добавьте строки:
В build.gradle модуля добавьте строки (VERSION – версия, которую вы планируете добавить. Список версий можно найти в ):
Обратите внимание: размер выходного файла будет больше.
Вне зависимости от выбранного режима, добавьте еще:
Этот коллбэк вызывается после окончания проверки и возвращает результат анализа (не применяется в режиме capture). Вид результата зависит от result_mode.
Если result_mode установлен как safe, коллбэкon_complete возвращает только состояние анализов:
Обратите внимание: перечисленные ниже result_mode используются только для тестирования. Если информации, которая передается в режиме Safe, вам недостаточно, настройте плагин в соответствии с .
При значении status коллбэк возвращает состояние анализов, а также – для каждого типа анализа – название типа, состояние анализа этого типа и вердикт системы.
При значенииfolderвозвращается практически то же самое, что при status, только добавляется идентификатор папки.
В этом случае коллбэк возвращает полную информацию, включая чувствительные данные. Мы рекомендуем использовать safe; full будет отключен в ближайших релизах из соображений безопасности.
Если наш SDK используется только для съемки, пропустите этот шаг.
Чтобы выполнить проверку, нужно загрузить в систему медиафайлы, а затем запустить для них анализы.
Пример:
Для удаления медиафайлов после выполнения всех проверок используйте метод clearTempDirectory.
Для добавления метаданных используйте метод AnalysisRequest.addFolderMeta.
В структуре Analysis можно передать дополнительные параметры, например, для извлечения на сервере лучшего кадра.
Чтобы использовать медиафайлы, снятые не Oz iOS SDK, укажите путь к ним в структуре (полеbestShotURL):
Для добавления медиафайлов в определенную папку используйте метод addFolderId:
Для добавления нового языкового пакета или модификации существующего следует воспользоваться методом add_lang(lang_id, lang_obj).
Параметры:
lang_id – строковое значение, которое далее можно использовать в качестве параметра lang метода open();
lang_obj– объект, ключами которого являются идентификаторы строк перевода, а значениями – сами строки перевода.
Список идентификаторов языков:
*До версии 1.3.1 назывался pt.
Пример использования:
OzLiveness.add_lang('ru', ruTranslation), гдеruTranslation – объект JSON.
Для установки нужного языка укажите его идентификатор в lang:
Вы можете запросить, какие языковые пакеты установлены в Web SDK, с помощью метода ozLiveness.get_langs(). Добавленные вручную локали также отобразятся.
Список всех строковых идентификаторов:
Ключи вида oz_action_*_go относятся к соответствующим жестам. oz_tutorial_camera_* – к подсказкам, как включить камеру для различных браузеров. Остальные – к подсказкам для всех жестов, информационным сообщениям или ошибкам.
Если какие-либо из ключей в вашем языковом пакете отсутствуют, соответствующие строки будут отображаться на английском языке.
Для добавления OZLivenessSDK в ваше приложение через менеджер зависимостей CocoaPods и интеграции OZLivenessSDK в проект Xcode добавьте в Podfile:
VERSION (опционально, по умолчанию устанавливается последняя версия) – версия, которую можно найти в .
Начиная с версии 8.1.0, можно использовать упрощенный код:
По умолчанию устанавливается полная версия SDK (с режимами анализа на сервере и на устройстве). Если нужен только серверный анализ, код будет выглядеть так:
Для версий 8.1.0 и выше:
Установка через SPM возможна для SDK версий 8.7.0 и новее.
Добавьте через SPM зависимости пакетов по ссылке: (, как добавить зависимости). Файл OzLivenessSDK обязателен для добавления, OzLivenessSDKOnDevice можно не добавлять, если вы не используете анализы на устройстве.
Вы также можете добавить файлы SDK в проект вручную.
Скачайте следующие файлы и добавьте их в проект:
OZLivenessSDK.xcframework,
OZLivenessSDKResources.bundle,
OZLivenessSDKOnDeviceResources.bundle (если вы не используете анализы на устройстве, этот файл можно не скачивать).
Скачайте TensorFlow : потребуется версия 2.11.
Убедитесь, что:
оба файла xcframework отображаются в Target-Build Phases -> Link Binary With Libraries и Target-General -> Frameworks, Libraries, and Embedded Context;
файл(ы) bundle отображаются в Target-Build Phases -> Copy Bundle Resources.
Для работы плагина Oz Liveness браузер должен поддерживать JavaScript ES6. Версия браузера должна быть не ниже указанной в таблице.
*В режиме совместимости с Internet Explorer Web SDK работать не будет, так как не поддерживаются некоторые важные функции.
Для авторизации в Oz API используйте адрес API и , как показано ниже.
Второй вариант: логин и пароль.
Мы рекомендуем использовать метод аутентификации по токену доступа, как более безопасный.
По умолчанию логи сохраняются вместе с данными по анализам. Если вы планируете хранить логи отдельно от этих данных, настройте отдельное подключение для :
При работе с Web SDK ваше приложение обращается к Web Plugin, который работает в контексте браузера. Плагин обменивается информацией с Web Adapter, а тот, в свою очередь – с Oz API.
Образец кода Oz Liveness Web SDK находится . Чтобы все работало корректно, нужно заменить <web-adapter-url> на полученную от нас ссылку на Web Adapter.
В перечисленных ниже образцах кода нужно заменить ссылку https://web-sdk.sandbox.ozforensics.com в index.html.
Образец кода для
Образец кода для
Образец кода для
Образец кода для
Чтобы скрыть окно плагина, не отменяя запросы результатов анализов и пользовательские callback'и, воспользуйтесь методом hide(). Метод может пригодиться, если, к примеру, после отправки данных требуется вывести собственный индикатор загрузки.
Для принудительного закрытия окна плагина воспользуйтесь методом close(). При этом все запросы к серверу и callback-функции (кроме on_close) в рамках данной сессии будут остановлены.
Пример использования:
Google Chrome (и другие браузеры на движке Chromium)
56
Mozilla Firefox
55
Safari
11
Microsoft Edge*
17
Opera
47
OzLiveness.open({
// При получении промежуточного результата скрываем окно плагина и показываем собственные индикаторы загрузки
on_result: function(result) {
OzLiveness.hide();
if (result.state === 'processing') {
show_my_loader();
}
},
on_complete: function() {
hide_my_loader();
}
});var session_id = 123;
OzLiveness.open({
// Передаем произвольные метаданные, по которым в дальнейшем сможем идентифицировать сессию в Oz API
meta: {
session_id: session_id
},
// После отправки данных принудительно закрываем окно плагина и самостоятельно запрашиваем результат
on_submit: function() {
OzLiveness.close();
my_result_function(session_id);
}
});INITIAL
-
-
начальное состояние
начальное состояние
PROCESSING
начальное состояние
начальное состояние
анализы в процессе
анализы в процессе
FAILED
ошибка системы
ошибка системы
ошибка системы
ошибка системы
FINISHED
успешное завершение
-
успешное завершение
DECLINED
-
отрицательный анализ
-
отрицательный анализ
OPERATOR_REQUIRED
-
требуется перепроверка
-
требуется перепроверка
SUCCESS
-
положительный анализ
-
положительный анализ
{
"error_code": 0,
"error_message": "Unknown server side error occurred",
"details": null
}Код ошибки
Значение
Описание
0
UNKNOWN
Неизвестная серверная ошибка.
1
NOT ALLOWED
Вызван недопустимый метод, обычно сопровождается 405 статусом HTTP-ответа при вызове HTTP-метода, не поддерживаемого ресурсом (например PATCH, если ресурс поддерживает только GET/POST).
2
NOT REALIZED
Вызван web-сервис, который не реализован на сервере, может встретиться в случае, если сервис по документации присутствует, однако фактически не реализован (временно или на постоянной основе).
3
INVALID STRUCTURE
Некорректная структура запроса, обычно встречается, если не удается найти обязательный параметр или тело запроса передано в некорректном формате.
4
INVALID VALUE
Некорректное значение параметра, например может возникать в случаях: передана строка, которая должна иметь формат UUID, но при этом она не конвертируется корректно, передано отрицательное значение смещения/ширины окна при постраничном запросе.
5
INVALID TYPE
Некорректный тип данных для параметра.
6
AUTH NOT PROVIDED
Не указан токен авторизации.
7
AUTH INVALID
Указан несуществующий авторизационный токен.
8
AUTH EXPIRED
Авторизационный токен просрочен.
9
AUTH FORBIDDEN
Недостаточно прав для запрошенной операции.
10
NOT EXIST
Запрашиваемый ресурс не существует (аналог HTTP status_code = 404).
11
EXTERNAL SERVICE
Ошибка взаимодействия с внешней информационной системой.
12
DATABASE
Критическая ошибка работы с базой данных на стороне сервера.
<script src="/plugin_liveness.php"></script><link rel="stylesheet" href="https:///plugin/ozliveness.css" />
<script src="https:///plugin_liveness.php"></script>allprojects {
repositories {
maven { url "https://ozforensics.jfrog.io/artifactory/main" }
}
}dependencies {
implementation 'com.ozforensics.liveness:sdk:VERSION'
}dependencies {
implementation 'com.ozforensics.liveness:full:VERSION'
}android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}{
"state": "finished"
}{
"state": "finished",
"analyses": {
"quality": {
"state": "finished",
"resolution": "success"
}
}
}{
"state": "finished",
"folder_id": "your_folder_id",
"analyses": {
"quality": {
"state": "finished",
"resolution": "success"
}
}
}let analysisRequest = AnalysisRequestBuilder()
// создайте анализы
let analysis = Analysis.init(
media: mediaToAnalyze, // mediaToAnalyze – массив объектов OzMedia
type: .quality, // типы анализов перечислены в методах iOS SDK
mode: .serverBased // .onDevice для анализа на устройстве
)
analysisRequest.addAnalysis(analysis)
// initiate the analyses
analysisRequest.run(
statusHandler: { state in }, // добавьте обработчик шагов сценария
errorHandler: { _ in }
) { result in
// ваш обработчик результата
}let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased)
var folderMeta: [String: Any] = ["key1": "value1"]
analysisRequest.addFolderMeta(folderMeta)
...let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased, params: [“extract_best_shot” : true])let referenceMedia = OZMedia.init(movement: .selfie,
mediaType: .movement,
metaData: ["meta":"data"],
videoURL: nil,
bestShotURL: imageUrl,
preferredMediaURL: nil,
timestamp: Date())let analysis = Analysis.init(media: mediaToAnalyze, type: .quality, mode: .serverBased)
analysisRequest.addFolderId(IdRequired)en
Английский
ru
Русский
es
Испанский
pt-br*
Португальский (бразильский)
kz
Казахский
// Редактируем текст кнопки
OzLiveness.add_lang('ru', {
action_photo_button: 'Сделать фото'
});OzLiveness.open({
lang: 'es', // идентификатор нужного языка
...
});pod 'OZLivenessSDK', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios', :tag => 'VERSION'// для установки последней версии
pod ‘OZLivenessSDK’
// ИЛИ для установки конкретной версии
// pod ‘OZLivenessSDK’, ‘8.10.0’pod 'OZLivenessSDK/Core', :git => 'https://gitlab.com/oz-forensics/oz-liveness-ios.git', :tag => 'VERSION'pod ‘OZLivenessSDK/Core’
// ИЛИ
// pod ‘OZLivenessSDK/Core’, ‘8.1.0’OZSDK.setApiConnection(Connection.fromServiceToken(host: "https://sandbox.ohio.ozforensics.com", token: token)) { (token, error) in
}OZSDK.setApiConnection(Connection.fromCredentials(host: “https://sandbox.ohio.ozforensics.com”, login: login, password: p)) { (token, error) in
// Ваш код для обработки ошибки или токена
}let eventsConnection = Connection.fromCredentials(host: https://echo.cdn.ozforensics.com/,
login: <[email protected]>,
password: your_telemetry_password)
OZSDK.setEventsConnection(eventsConnection) { (token, error) in
}
OzLivenessSDK.INSTANCE.getConfig().setCustomization(new UICustomization(
// параметры настройки верхней панели
new ToolbarCustomization(
R.drawable.ib_close,
new Color.ColorHex("#FFFFFF"),
new Color.ColorHex("#000000"),
100, // непрозрачность фона верхней панели (в %)
),
// параметры настройки текста подсказки
new CenterHintCustomization(
70, // положение по вертикали (в %)
),
// параметры настройки анимации подсказки
new HintAnimation(
hideAnimation = true
),
// параметры настройки рамки вокруг лица
new FaceFrameCustomization(
new Color.ColorHex("#EC574B"),
new Color.ColorHex("#00FF00"),
6, // ширина линии рамки (в dp)
),
// параметры настройки фона за рамкой
new BackgroundCustomization(
100 // непрозрачность фона (в %)
),
)
);OzLivenessSDK.config.customization = UICustomization(
// параметры настройки верхней панели
toolbarCustomization = ToolbarCustomization(
closeIconTint = Color.ColorHex("#FFFFFF"),
backgroundColor = Color.ColorHex("#000000"),
backgroundAlpha = 100,
),
// параметры настройки текста подсказки
centerHintCustomization = CenterHintCustomization(
verticalPosition = 70
),
hintAnimation = HintAnimation(
hideAnimation = true
),
// параметры настройки рамки вокруг лица
faceFrameCustomization = FaceFrameCustomization(
strokeDefaultColor = Color.ColorHex("#EC574B"),
strokeFaceInFrameColor = Color.ColorHex("#00FF00"),
strokeWidth = 6,
),
// параметры настройки фона за рамкой
backgroundCustomization = BackgroundCustomization(
backgroundAlpha = 100
),
)Для работы SDK требуется лицензия. Сгенерируйте тестовую лицензию самостоятельно здесь (внимание, страница на английском языке) или свяжитесь с нами по email для выпуска продуктивной лицензии. Для подготовки лицензии потребуется bundle id. Есть два способа добавить лицензию в проект:
Переименуйте файл в forensics.license и поместите его в проект. Прописывать путь в этом случае не нужно.
Обновление лицензии для уже работающего приложения или в том случае, если вы хотите держать лицензию вне проекта:
OZSDK(licenseSources: [.licenseFileName(“forensics.license”)]) { licenseData, error in
if let error = error {
print(error)
}
}или
OZSDK(licenseSources: [.licenseFilePath(“path_to_file”)]) { licenseData, error in
if let error = error {
print(error)
}
} LicenseSource – источник лицензии, LicenseData – информация о лицензии. В этот метод встроена проверка наличия активной лицензии, если такая лицензия есть – будет использоваться она, а не та, путь к которой вы указали. Для принудительной замены лицензии используйте метод setLicense.
Если при обработке лицензии возникнут ошибки, вы получите сообщение с описанием этих ошибок. Если ошибок нет, система выведет данные о лицензии. Вы также можете запросить эти данные с помощью OZSDK.licenseData.
License error. License at (your_URI) not found
Отсутствует файл лицензии. Проверьте наименование и путь к файлу.
License error. Cannot parse license from (your_URI), invalid format
Файл лицензии поврежден. Пожалуйста, отправьте его нам по электронной почте.
License error. Bundle company.application.id is not in the list allowed by license (bundle.id1, bundle.id2)
Идентификатор приложения отсутствует в списке разрешенных для данной лицензии идентификаторов. Проверьте написание, если все корректно, нужна новая лицензия.
License error. Current date yyyy-mm-dd hh:mm:ss is later than license expiration date yyyy-mm-dd hh:mm:ss
Срок действия лицензии истек. Пожалуйста, свяжитесь с нами.
License is not initialized.
Лицензия не устанавливалась. Добавьте лицензию в проект.
Для выпуска лицензии потребуется информация о доменных именах сайтов, где будет использоваться Web SDK. Можно также указывать поддомены.
Укажите информацию о лицензии одним из двух способов:
через данные о лицензии:
OzLiveness.open({
license: {
'payload_b64': 'some_payload',
'signature': 'some_data',
'enc_public_key': 'some_key'
},
...,
})через путь к лицензии:
OzLiveness.open({
licenseUrl: 'https://some_url',
...,
})Проверьте, как установилась лицензия: например, пройдите по доменному имени хоста и выполните действие Liveness -> Simple selfie.
Далее при каждом запуске Web SDK система будет проверять валидность лицензии.
Создайте контроллер для съемки видео:
let actions: [OZVerificationMovement] = [.scanning, .smile, .far]
let ozLivenessVC: UIViewController = OZSDK.createVerificationVCWithDelegate(self, actions: actions)
self.present(ozLivenessVC, animated: true)action– перечень действий пользователя при записи видео.
По окончании съемки вызывается метод onOZLivenessResult(results:[OZMedia]):
extension viewController: OZLivenessDelegate {
func onError(status: OZVerificationStatus?) {
//показать ошибку
}
}
func onOZLivenessResult(mediaToAnalyze: [OZMedia]) {
//Перейти к выполнению проверки
}
}Метод возвращает результаты съемки в виде массива объектов[OZMedia], которые используются на следующем шаге для выполнения проверок.
Если пользователь прервет запись видео (закроет экран), появится ошибка failedBecauseUserCancelled.
Для работы с Oz API вы можете использовать свободно распространяемое ПО Postman. Скачайте клиентскую часть Postman по ссылке и установите ПО.
Загрузите JSON-файл с нужной коллекцией Postman.
Отдельная коллекция для Instant API:
Oz API 5.1.0 работает с этой же коллекцией.
3.33
После запуска клиента необходимо импортировать актуальную коллекцию для Postman, для этого в клиенте нажмите кнопку Import:
Нажмите files для выбора файла, найдите нужный JSON и нажмите Открыть:
Импортированная коллекция со всеми методами взаимодействия появится в интерфейсе Postman:
Если наш SDK используется только для съемки, пропустите этот шаг.
Чтобы выполнить проверку, нужно загрузить в систему медиафайлы, а затем запустить для них анализы.
Пример работы:
Для удаления медиафайлов после выполнения всех проверок используйте метод clearActionVideos.
Для добавления метаданных используйте метод addFolderMeta.
В структуре Analysis можно передать дополнительные параметры, например, для извлечения на сервере лучшего кадра.
Чтобы использовать медиафайлы, снятые не Oz Android SDK, укажите путь к ним в структуре :
Для добавления медиафайлов в определенную папку используйте метод setFolderId:
Этот коллбэк вызывается раз в несколько секунд в процессе анализа и возвращает промежуточный результат (не применяется в режиме capture). Вид результата зависит от result_mode.
Если result_mode установлен как safe, коллбэк on_result возвращает только состояние анализов:
или
Обратите внимание: перечисленные ниже result_mode используются только для тестирования. Если информации, которая передается в режиме Safe, вам недостаточно, настройте плагин в соответствии с .
При значении status коллбэк возвращает состояние анализов, а также – для каждого типа анализа – название типа, состояние анализа этого типа и вердикт системы.
или
При значенииfolderвозвращается практически то же самое, что при status, только добавляется идентификатор папки.
В этом случае коллбэк возвращает полную информацию, включая чувствительные данные. Мы рекомендуем использовать safe; full будет отключен в ближайших релизах из соображений безопасности.
initSDK в дебаг-режиме для iOS теперь работает корректно.
Добавили возможность выполнять .
Исправили ошибку в коде примера.
Подсказка для жеста Сканирование теперь озвучивается корректно.
При попытке удалить референтное фото SDK теперь запрашивает подтверждение.
Исправили ошибку с темным фоном при запуске SDK.
Исправили ошибку, из-за которой при биометрическом анализе одно из изображений переворачивалось.
Исправили несколько ошибок, возникавших во время анализов на устройстве и при гибридном анализе.
Android: теперь поддерживаем Google Dynamic Feature Delivery.
Android: исправили ошибку, из-за которой SDK мог вылететь при закрытии экрана съемки.
iOS: исправили ошибку с интеграцией через Swift UI.
iOS: в соответствии с требованиями Apple обновили Xcode до версии 16.
Повысили безопасность и обновили телеметрию.
Обновили логику авторизации.
Улучшили логику озвучивания подсказок.
Обновления безопасности.
Android: валидацию видео – опцию, которая запускает запись видео заново, если получившийся файл состоит из 3 кадров и менее – теперь можно отключить.
iOS: SDK теперь сжимает медиафайлы, если их размер превышает 10 МБ.
iOS: жесты с движениями головы теперь обрабатываются корректно.
iOS: в соответствии с требованиями Apple обновили Xcode до версии 16.
Обновления безопасности и телеметрии.
Подсказки SDK и элементы управления интерфейса могут озвучиваться в соответствии с требованиями WCAG.
Упростили прохождение проверки для жестов, включающих движение головы.
Android: сжатие больших видео теперь происходит на этапе закрытия экрана Liveness.
Android: исправили ошибку, из-за которой изображение с закрытыми глазами могло быть выбрано в качестве лучшего кадра.
Android: исправили проблемы с кодеками, появлявшиеся на некоторых моделях смартфонов.
Android: исправили ошибку, из-за которой некоторые записанные SDK видео были зелеными.
iOS: добавили поддержку Xcode 16.
iOS: при использовании основной (задней) камеры яркость экрана теперь не меняется.
iOS: исправили ошибку записи видео, появлявшуюся на некоторых моделях смартфонов.
Метод executeLiveness больше не используется. Съемка теперь запускается с помощью метода startLiveness.
Обновили код для получения результата съемки.
Обновления безопасности и телеметрии.
При попытке передать пустую строку в качестве аргумента для методов addFolderId (iOS) и setFolderID (Android)теперь показывается информативная ошибка.
Android: исправили ошибку с бесконечно крутящимся спиннером, который появлялся при переключении пользователя на другое приложение во время прохождения проверки Liveness.
Android: исправили несколько ошибок, появлявшихся только на определенных моделях смартфонов.
Обновления безопасности и телеметрии.
Android: улучшили модель Liveness для проверки на устройстве.
Android: обновления безопасности.
iOS: синхронизировали с Android сообщения, которые SDK показывает после загрузки медиафайла.
iOS: исправили баг с задержками запуска анализа, которые иногда возникали для анализа по одному кадру.
Длительность жеста Селфи теперь можно менять (размер видеофайла также изменится).
Убрали паузу после жеста Сканирование.
Обновления безопасности и журналирования.
Android: если размер записанного видеофайла больше 10 Мбайт, видео будет сжато.
Android: обновили модель Liveness для проверки на устройстве.
iOS: изменили поведение для отсутствующих переводов при добавлении новых ключей в локализацию: теперь вместо названия ключа показывается текст на языке по умолчанию (английском).
Исправили ошибки.
Добавили возможность использования мастер-лицензии, которая работает с любым bundle_id.
Android: исправили ошибку со сжатием видео при гибридном анализе, которая возникала на некоторых моделях телефонов.
iOS: исправили ошибку с мигающим фоном при съемке.
Выпущена первая версия.
Для авторизации в Oz API используйте адрес API и , как показано ниже.
Мы рекомендуем:
Указывать адрес API в вашем приложении на экране, предшествующем проверке Liveness. После установки адреса происходит служебный вызов API, и если вы устанавливаете адрес при запуске или инициализации приложения, нагрузка на сервер может быть слишком высокой.
Убедиться, что перед вызовом метода createStartIntent вы инициализировали SDK и подключили его к API. Порядок действий значения не имеет, но они должны успешно завершиться к моменту начала работы createStartIntent.
Второй вариант: логин и пароль.
Мы рекомендуем использовать метод аутентификации по токену доступа, как более безопасный.
По умолчанию логи сохраняются вместе с данными по анализам. Если вы планируете хранить логи отдельно от этих данных, настройте отдельное подключение для :
Очистка авторизации:
Проверка наличия сохраненного access-токена Oz API:
LogOut:
Для настройки интерфейса воспользуйтесь разделом style в методе Ozliveness.open. Изменить можно следующие настройки:
faceFrame – цвет рамки вокруг лица:
faceReady – цвет рамки при правильном расположении лица;
faceNotReady – цвет рамки при неправильном положении лица, когда анализ не может быть запущен.
centerHint – текст подсказки в центре.
textSize – размер текста;
color – цвет текста;
yPosition – позиция по вертикали относительно верха контейнера;
letterSpacing – расстояние между буквами;
fontStyle – стиль текста (полужирный, курсив и так далее).
closeButton – кнопка закрытия плагина:
image – изображение для кнопки, может быть картинкой в формате PNG или dataURL в base64.
backgroundOutsideFrame – заливка вне рамки вокруг лица:
color – цвет заливки.
Пример:
Результаты анализа доступны клиентскому приложению через функции-коллбэки Web Plugin, однако мы рекомендуем получать их через бэкенд напрямую от Oz API и там же обрабатывать впоследствии. Таким образом исключается вероятность манипуляций с результатами анализов через контекст браузера.
Чтобы найти нужную папку со стороны бэкенда, сделайте следующее:
На фронтенде добавьте уникальный идентификатор папки через метаданные:
Вы можете добавить собственные пары ключ-значение для хранения любой текстовой информации, например, номера документа или телефона. Однако удостоверьтесь при этом, что соблюдаются нормы законодательства о защите персональной информации.
Для оповещения о завершении анализа используйте функцию-коллбэк on_result, затем вызовите бэкенд и передайте значение transaction_id.
На стороне бэкенда найдите папку по присвоенному ранее идентификатору с помощью метода Folder LIST:
Для ускорения обработки запроса мы рекомендуем ограничить выдачу по времени:
В ответе придут результаты анализов и идентификатор папки folder_id - он потребуется для дальнейших действий.
Web Adapter отправляет Web Plugin данные с различным уровнем детализации. Для продакшна рекомендуется установить минимальный уровень. Для этого в Web Adapter установите параметру result_mode значение "safe".
OzLiveness.open({
// ...
style: {
//блок для обратной совместимости
doc_color: "",
face_color_success: "",
face_color_fail: "",
//основной блок
faceFrame: {
faceReady: "",
faceNotReady: "",
},
centerHint: {
textSize: "",
color: "",
yPosition: "",
letterSpacing: "",
fontStyle: "",
},
closeButton: {
image: "",
},
backgroundOutsideFrame: {
color: "",
},
},
// ...
});{
"state": "processing"
}{
"state": "finished"
}{
"state": "processing",
"analyses": {
"quality": {
"state": "processing",
"resolution": ""
}
}
}{
"state": "finished",
"analyses": {
"quality": {
"state": "finished",
"resolution": "success"
}
}
}{
"state": "processing",
"folder_id": "your_folder_id",
"analyses": {
"quality": {
"state": "processing",
"resolution": ""
}
}
}OzLiveness.open({
...
meta: {
// идентификатор пользователя или лида из стороннего лидогенератора
// передавайте ID, если вам нужно отслеживать несколько попыток от одного и того же пользователя
'end_user_id': '<user_or_lead_id>',
// уникальный идентификатор попытки
'transaction_id': '<unique_id1>'
}
});/api/folders/?meta_data=transaction_id==unique_id1&with_analyses=true/api/folders/?meta_data=transaction_id==unique_id1&with_analyses=true&time_created.min=([CURRENT_TIME]-1hour)"result_mode": "safe"


.addFolderMeta(
mapOf(
"key1" to "value1",
"key2" to "value2"
)
).addFolderMeta(Collections.singletonMap("key", "value")) mapOf("extract_best_shot" to true) val file = File(context.filesDir, "media.mp4") // замените context.filesDir на context.getExternalFilesDir(null) для внешнего хранилища смартфона
val media = OzAbsractMedia.OzVideo(OzMediaTag.VideoSelfieSmile, file.absolutePath) .setFolderId(folderId)analysisCancelable = AnalysisRequest.Builder()
// mediaToAnalyze – массив объектов OzAbstractMedia
.addAnalysis(Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaToAnalyze))// ON_DEVICE для анализа на устройстве
.build()
//запуск анализов и установка обработчиков
.run(object : AnalysisRequest.AnalysisListener {
override fun onStatusChange(status: AnalysisRequest.AnalysisStatus) { handleStatus(status) //или ваш обработчик шагов сценария
}
override fun onSuccess(result: RequestResult) {
handleResults(result) //или ваш обработчик результата
}
override fun onError(error: OzException) { handleError(error) //или ваш обработчик ошибок
}
})analysisCancelable = new AnalysisRequest.Builder()
//mediaToAnalyze – массив объектов OzAbstractMedia
.addMedia(mediaToAnalyze)
.addAnalysis(new Analysis(Analysis.Type.QUALITY, Analysis.Mode.SERVER_BASED, mediaToAnalyze)) //ON_DEVICE для анализа на устройстве
.build()
//запуск анализов и установка обработчиков
.run(new AnalysisRequest.AnalysisListener() {
@Override
public void onSuccess(@NonNull RequestResult list) { handleResults(list); } //или ваш обработчик результата
@Override
public void onError(@NonNull OzException e) { handleError(e); } //или ваш обработчик ошибок
@Override
public void onStatusChange(@NonNull AnalysisRequest.AnalysisStatus analysisStatus) { handleStatus(analysisStatus); } //или ваш обработчик шагов сценария
});OzLivenessSDK.setApiConnection(null)OzLivenessSDK.INSTANCE.setApiConnection(null, null);val isLoggedIn = OzLivenessSDK.isLoggedInboolean isLoggedIn = OzLivenessSDK.INSTANCE.isLoggedIn();OzLivenessSDK.logout()OzLivenessSDK.INSTANCE.logout();OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(host, token))OzLivenessSDK.INSTANCE.setApiConnection(
OzConnection.Companion.fromServiceToken(host, token),
null
);OzLivenessSDK.setApiConnection(
OzConnection.fromCredentials(host, username, password),
statusListener(
{ token -> /* токен */ },
{ ex -> /* ошибка */ }
)
)OzLivenessSDK.INSTANCE.setApiConnection(
OzConnection.Companion.fromCredentials(host, username, password),
new StatusListener<String>() {
@Override
public void onStatusChanged(@Nullable String s) {}
@Override
public void onSuccess(String token) { /* токен */ }
@Override
public void onError(@NonNull OzException e) { /* ошибка */ }
}
);OzLivenessSDK.setEventsConnection(
OzConnection.fromCredentials(
"https://echo.cdn.ozforensics.com/",
"<[email protected]>",
"your_telemetry_password"
)
)OzLivenessSDK.setEventsConnection(
OzConnection.fromCredentials(
"https://tm.ozforensics.com/",
"<[email protected]>",
"your_telemetry_password"
)
);Мастер-лицензия – это оффлайн-лицензия, с которой можно использовать мобильные SDK без ограничений по bundle_id, в отличие от обычных лицензий. Для получения мастер-лицензии нужно создать пару ключей, как описано ниже. Отправьте нам публичный ключ по электронной почте, и вскоре после этого мы отправим вам мастер-лицензию.
Вашему приложению нужно будет подписать свой bundle_id приватным ключом. Мобильные SDK проверяют подпись с помощью публичного ключа из мастер-лицензии. Действие таких лицензий ограничено по времени.
В этом разделе описано, как создавать приватный и публичный ключи.
Чтобы создать приватный ключ, последовательно запустите следующие команды:
openssl genpkey -algorithm RSA -outform DER -out privateKey.der -pkeyopt rsa_keygen_bits:2048
# for MacOS
base64 -i privateKey.der -o privateKey.txt
# for Linux
base64 -w 0 privateKey.der > privateKey.txtВы получите два файла:
privateKey.der – приватный ключ .der;
privateKey.txt – privateKey.der в кодировке base64. Содержимое этого файла используется в качестве подписи bundle_id хостового приложения.
Спецификация команд OpenSSL: https://www.openssl.org/docs/man1.1.1/man1/openssl-pkcs8.html
Чтобы создать публичный ключ, последовательно запустите следующие команды:
openssl rsa -pubout -in privateKey.pem -out publicKey.pub
base64 -w 0 publicKey.pub > publicKey.txtВы получите публичный ключ publicKey.pub. Отправьте его нам по электронной почте. В ответ мы пришлем вам лицензию.
Инициализация SDK:
OZSDK(licenseSources: [LicenseSource], masterLicenseSignature: String? = nil, completion: @escaping ((LicenseData?, LicenseError?) -> Void))Установка лицензии:
setLicense(licenseSource: LicenseSource, masterLicenseSignature: String? = nil)Перед инициализацией SDK создайте закодированную base64 подпись для bundle_id хостового приложения с помощью приватного ключа.
Пример создания подписи:
private func getSignature() -> String? {
let privateKeyBase64String = "содержимое файла privateKey.txt"
guard let data = Data(base64Encoded: privateKeyBase64String, options: [.ignoreUnknownCharacters]) else {
return nil
}
let sizeInBits = data.count * 8
let keyDict: [CFString: Any] = [
kSecAttrKeyType: kSecAttrKeyTypeRSA,
kSecAttrKeyClass: kSecAttrKeyClassPrivate,
kSecAttrKeySizeInBits: NSNumber(value: sizeInBits)
]
var error: Unmanaged<CFError>?
guard let secKey = SecKeyCreateWithData(data as CFData, keyDict as CFDictionary, &error) else {
return nil
}
guard let bundleID = Bundle.main.bundleIdentifier else {
return nil
}
guard let signature = SecKeyCreateSignature(secKey,
.rsaSignatureMessagePKCS1v15SHA512, // Это критично!!!!
Data(bundleID.utf8) as CFData,
&error) else {
return nil
}
return (signature as Data).base64EncodedString()
}Передайте подпись как параметр masterLicenseSignature во время инициализации SDK или установки лицензии.
Если подпись невалидна, инициализация продолжится по стандартной схеме: проверка включенных в лицензию bundle_id.
Работа с OZ Mobile SDK в операционной системе «iOS»
Чтобы начать пользоваться нашим SDK, нужно выполнить следующие шаги.
Добавьте SDK в проект, как описано здесь.
Получите лицензию на SDK – сгенерируйте тестовую самостоятельно на нашем сайте или запросите «боевую» по электронной почте. Для лицензии потребуется bundle id. Добавьте лицензию в проект, как описано здесь.
Подключите SDK к API. Это необязательный шаг, он выполняется, только если вам нужно обрабатывать какие-либо данные на сервере. Если вы используете режим анализа на устройстве, никакие данные никуда не передаются, и подключение к API не нужно.
Создайте контроллер для съемки, как описано здесь – вы получите медиафайлы, которые потом можно будет отправить на анализ.
Запустите нужные вам проверки для полученных на предыдущем шаге медиафайлов. Здесь описано, как выполнять проверки.
Если вы хотите настроить внешний вид SDK, здесь написано, как это делается.
Минимальная версия iOS: 11.
Минимальная версия Xcode: 16.
Доступные языки: EN, RU, ES, HY, KK, KY, TR.
Исходный код примера приложения с использованием Oz Liveness SDK расположен в репозитории GitLab:
Список методов и полей SDK:
Актуальную сборку демо-приложения Вы можете загрузить по ссылке.
Для старта записи видео используется метод startActivityForResult:
actions – перечень при записи видео.
Для представления Fragment код приведен ниже. LivenessFragment – для экрана Liveness.
Для корректной работы лицензии мы рекомендуем сначала инициализировать SDK, и только потом вызывать открытие экрана Liveness.
Для получения результатов записи видео используется метод onActivityResult:
sdkMediaResult – объект с результатами записи видео () для дальнейшего использования при взаимодействии с Oz API.
sdkErrorString – описание в случае их возникновения.
Если пользователь прервет запись видео (закроет экран), resultCode примет значение Activity.RESULT_CANCELED.
Пример кода для обработки:
Oz Liveness Web SDK представляет собой модуль съемки и отправки медиаданных на анализы из веб-браузера на клиентском устройстве. Поддерживаются все основные браузеры на большинстве устройств. Доступные языки: EN, RU, ES, PT-BR, KK.
Образец кода Oz Liveness Web SDK находится . Чтобы все работало корректно, нужно заменить <web-adapter-url> на полученную от нас ссылку на Web Adapter.
Для Angular и React нужно заменить https://web-sdk.sandbox.ozforensics.com в index.html.
Образец кода для
Образец кода для
Web SDK только работает по протоколу HTTPS (с SSL-шифрованием); на localhost и 127.0.01 можно использовать HTTP для проверки доступности ресурсов.
Oz Liveness Web SDK состоит из двух частей:
Клиентская – . Используется в виде подгружаемого JavaScript-файла в Frontend-приложении клиента.
Серверная – . Устанавливается в виде отдельного серверного модуля с привязкой к .
Руководства по интеграции:
Oz Web SDK можно развернуть как , так и на наших (SaaS), в последнем случае разворачиваем и поддерживаем программное обеспечение мы, а вы пользуетесь уже готовым и настроенным продуктом. для выбора более удобного варианта.
Для работы Web SDK потребуется информация о доменных именах сайтов, где вы будете его использовать (она необходима для оформления лицензии).
Пошаговая инструкция по использованию Web SDK:
плагин в свою страницу.
Если вы хотите настроить интерфейс Oz Web SDK под себя, рассказано, как это сделать.
Мастер-лицензия – это оффлайн-лицензия, с которой можно использовать мобильные SDK без ограничений по bundle_id, в отличие от обычных лицензий. Для получения мастер-лицензии нужно создать пару ключей, как описано ниже. Отправьте нам публичный ключ по электронной почте, и вскоре после этого мы отправим вам мастер-лицензию.
Вашему приложению нужно будет подписать свой bundle_id приватным ключом. Мобильные SDK проверяют подпись с помощью публичного ключа из мастер-лицензии. Действие таких лицензий ограничено по времени.
В этом разделе описано, как создавать приватный и публичный ключи.
Чтобы создать приватный ключ, последовательно запустите следующие команды:
Вы получите два файла:
privateKey.der – приватный ключ .der;
privateKey.txt – privateKey.der в кодировке base64. Содержимое этого файла используется в качестве подписи bundle_id хостового приложения.
Спецификация команд OpenSSL:
Чтобы создать публичный ключ, запустите команду:
Вы получите публичный ключ publicKey.pub. Отправьте его нам по электронной почте. В ответ мы пришлем вам лицензию.
Инициализация SDK:
Перед инициализацией SDK создайте закодированную base64 подпись для bundle_id хостового приложения с помощью приватного ключа.
Пример создания подписи:
Передайте подпись как параметр masterLicenseSignature во время инициализации SDK.
Если подпись невалидна, инициализация продолжится по стандартной схеме: проверка включенных в лицензию bundle_id.
Анализы могут быть назначены медиафайлам как вручную пользователем – например, через выбор сценария Liveness в приложении – так и автоматически, когда выбор не производится и пользователь запускает все возможные анализы для папки с медиафайлами.
В последнем случае система автоматически определяет, какие именно анализы должны запускаться для того или иного медиафайла. При этом она исходит из того, какие указаны при загрузке файлов. Если файлы загружаются через web-консоль, теги расставляет пользователь, если ведется съемка через SDK – теги проставляются в процессе съемки также автоматически. Также роль играет тип медиафайлов: IMAGE (фото)/VIDEO/SHOTS_SET (приравнивается к видео). Если медиафайл не подходит под требования того или иного анализа, этот анализ такой медиафайл игнорирует.
Список настроек по умолчанию приведен ниже. Для изменения конфигурации, пожалуйста, .
Анализ выполняется для всех медиафайлов вне зависимости от воспроизводимого в них (теги жестов начинаются с video_selfie).
Внимание: в версии API 4.0.8 и ниже, чтобы отправить на анализ Quality (Liveness) изображение, а не видео, необходимо поместить его в архив .zip, установить тип файла SHOTS_SET и поставить один из тегов video_, иначе Quality изображение проигнорирует.
Анализ выполняется для всех фото и видео.
Если в папке будет менее двух подходящих медиафайлов, система вернет ошибку. Если более двух, то будут сравниваться все возможные пары, и система выдаст результат по паре с наименьшим сходством.
Анализ выполняется только при наличии заранее созданного черного списка для всех присутствующих в папке / указанных в качестве источника фото и видео.
Это дополнительная опция к анализу Quality. Анализ выполняется для всех медиафайлов, подходящих для анализа Quality. Соответствующую настройку можно отключить.
Сверка лица с документами (анализ “Documents”) выполняется для медиафайлов с тегами photo_id_front, photo_id_back (документы) и photo_selfie (селфи). Результат сверки будет положительным, если есть фото лица и хотя бы один валидный документ (с фотографией того же лица) из списка ниже:
паспорт
водительские права
заграничный паспорт
// параметры настройки верхней панели
let toolbarCustomization = ToolbarCustomization(
closeButtonIcon: UIImage(named: "example"),
closeButtonColor: .black.withAlphaComponent(0.8),
titleText: "",
titleFont: .systemFont(ofSize: 18, weight: .regular),
titleColor: .gray,
backgroundColor: .lightGray)
// параметры настройки текста подсказки
let centerHintCustomization = CenterHintCustomization(textColor: .white,
textFont: .systemFont(ofSize: 22, weight: .regular),
verticalPosition: 42,
backgroundColor: UIColor.init(hexRGBA: "1C1C1E8F")!,
hideTextBackground: false,
backgroundCornerRadius: 14)
// параметры настройки анимации подсказки
let hintAnimationCustomization = HintAnimationCustomization(
hideAnimation: false,
animationIconSize: 80,
toFrameGradientColor: UIColor.red)
// параметры настройки рамки вокруг лица
let faceFrameCustomization = FaceFrameCustomization(
strokeWidth: 4,
strokeFaceAlignedColor: .green,
strokeFaceNotAlignedColor: .red,
geometryType = .rect(cornerRadius: 10),
strokePadding: 3)
// параметры настройки текста версии SDK
let versionCustomization = VersionLabelCustomization(
textFont: .systemFont(ofSize: 13, weight: .regular),
textColor: .gray
)
// параметры настройки фона за рамкой
let backgroundCustomization = BackgroundCustomization(
backgroundColor: .lightGray
)
// параметры настройки защиты от мошенников
let antiscamCustomization: AntiscamCustomization = AntiscamCustomization(
customizationEnableAntiscam: false,
customizationAntiscamTextMessage: "Face recognition",
customizationAntiscamTextFont: UIFont.systemFont(ofSize: 15, weight: .semibold),
customizationAntiscamTextColor: UIColor.black,
customizationAntiscamBackgroundColor: UIColor.init(hexRGBA: "F2F2F7FF")!,
customizationAntiscamCornerRadius: 18,
customizationAntiscamFlashColor: UIColor.init(hexRGBA: "FF453AFF")!)
// параметры настройки логотипа,
// если лицензия предусматривает возможность его изменения
let logoCustomization = LogoCustomization(image: UIImage(), size: CGSize(width: 100, height: 100))
OZSDK.customization = Customization(toolbarCustomization: toolbarCustomization,
antiscamCustomization: antiscamCustomization,
centerHintCustomization: centerHintCustomization,
hintAnimationCustomization: hintAnimationCustomization,
faceFrameCustomization: faceFrameCustomization,
versionCustomization: vesrionCustomization,
backgroundCustomization: backgroundCustomization,
logoCustomization: logoCustomization)openssl genpkey -algorithm RSA -outform DER -out privateKey.der -pkeyopt rsa_keygen_bits:2048
# for MacOS
base64 -i privateKey.der -o privateKey.txt
# for Linux
base64 -w 0 privateKey.der > privateKey.txtopenssl rsa -pubout -in privateKey.der -out publicKey.pubfun init(
context: Context,
licenseSources: List<LicenseSource>,
masterLicenseSignature: String,
statusListener: StatusListener<LicensePayload>? = null,
)private fun getMasterSignature(): String {
Security.insertProviderAt(org.spongycastle.jce.provider.BouncyCastleProvider(), 1)
val privateKeyBase64String = "содержимое файла privateKey.txt"
val sig = Signature.getInstance("SHA512WithRSA")
val keySpec = PKCS8EncodedKeySpec(Base64.decode(privateKeyBase64String, Base64.DEFAULT))
val keyFactory = KeyFactory.getInstance("RSA")
sig.initSign(keyFactory.generatePrivate(keySpec))
sig.update(packageName.toByteArray(Charsets.UTF_8))
return Base64.encodeToString(sig.sign(), Base64.DEFAULT).replace("\n", "")
}KohJ1rsUgLMzZHpHGAZDK2efHPnMj9tw9VIedBLvyZt0B2JH3SWfJLJ8X6JNz3bR2sce6PR2wdEIFln0r1pUnD+6WBCgexKIHAv7esiRVQZoZOEANDBwDvJVv73H/0qL2LGlhxKzbBg5CxGPClTBQdLo1P+7HsTXHHG/Hf6m3rdu1OUeGXVPoaS2NzE8kiRH6gb8Nhr7PBLTUeMKTeLoiX13hvwjOqhV1ANhgS97T4hC2+ZilZt4RektgRY/+fGmWnOqErNeYuz/WSInfaJS0YEWhJW3gXKPjdCzNGIBIqbxaFSjU46wu/alh2+tBRFnrYFl1dRQVcTlW0VwwZHcug==Код ошибки
Сообщение
Описание
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. Возможно, медиафайлам не установлены теги.
when (resultCode) {
Activity.RESULT_CANCELED -> *USER CLOSED THE SCREEN*
OzLivenessResultCode.SUCCESS -> {
val sdkMediaResult = OzLivenessSDK.getResultFromIntent(data)
*SUCCESS*
}
else -> {
val errorMessage = OzLivenessSDK.getErrorFromIntent(data)
*FAILURE*
}
}val intent = OzLivenessSDK.createStartIntent(listOf(OzAction.Smile, OzAction.Blank))
startActivityForResult(intent, REQUEST_CODE)List<OzAction> actions = Arrays.asList(OzAction.Smile, OzAction.Scan);
Intent intent = OzLivenessSDK.createStartIntent(actions);
startActivityForResult(intent, REQUEST_CODE);childFragmentManager.beginTransaction()
.replace(R.id.content, LivenessFragment.create(actions))
.commit()
// подписка на результат Fragment
childFragmentManager.setFragmentResultListener(OzLivenessSDK.Extra.REQUEST_CODE, this) { _, result ->
when (result.getInt(OzLivenessSDK.Extra.EXTRA_RESULT_CODE)) {
OzLivenessResultCode.SUCCESS -> { /* запуск анализа */ }
else -> { /* вывод ошибки */ }
}
}getSupportFragmentManager().beginTransaction()
.replace(R.id.content, LivenessFragment.Companion.create(actions, null, null, false))
.addToBackStack(null)
.commit();
// подписка на результат Fragment
getSupportFragmentManager().setFragmentResultListener(OzLivenessSDK.Extra.REQUEST_CODE, this, (requestKey, result) -> {
switch (result.getInt(OzLivenessSDK.Extra.EXTRA_RESULT_CODE)) {
case OzLivenessResultCode.SUCCESS: {/* запуск анализа */}
default: {/* вывод ошибки */}
}
});override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE) {
sdkMediaResult = OzLivenessSDK.getResultFromIntent(data)
sdkErrorString = OzLivenessSDK.getErrorFromIntent(data)
}
}@Override
protected void onActivityResult(int requestCode, int resultCode, @androidx.annotation.Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
List<OzAbstractMedia> sdkMediaResult = OzLivenessSDK.INSTANCE.getResultFromIntent(data);
String sdkErrorString = OzLivenessSDK.INSTANCE.getErrorFromIntent(data);
}Работа на ваших серверах
Установите Web SDK. Вам помогут наши инженеры. Лицензия также будет установлена в этот момент. Когда вам потребуется ее обновить, воспользуйтесь .
Настройте .
SaaS
Ничего делать не нужно, установку и настройку серверной части обеспечивают инженеры Oz Forensics. Вы получите ссылку для интеграции (см. п. 2).
Объекты системы имеют иерархическую структуру подчинения.
На верхнем уровне находится Компания. Это значит, что один экземпляр установки Oz API может обслуживать пользователей нескольких не зависящих друг от друга компаний.
Пользователь является инициатором любого запроса. В зависимости от пользователя могут присутствовать определенные ограничения на те или иные действия.
При выполнении Пользователем запроса на Анализ система автоматически создает Папку, помещает туда все отправленные пользователем Медиафайлы, а затем запускает собственно (один или несколько). Анализы применяются к медиафайлам из папки в соответствии с . Требования к медиафайлам перечислены .
Каждый объект имеет набор полей для работы и идентификации на уровне REST API запросов.
Образец кода для Flutter вы можете найти .
Добавьте строки из блока ниже в pubspec.yaml проекта, где планируется использовать плагин.
Поместите файл лицензии (например, license.json или forensics.license) в папку Flutter application/assets. В pubspec.yaml добавьте asset:
Для Android укажите путь к репозиторию Oz в /android/build.gradle, раздел allprojects → repositories:
Для Flutter 8.24.0 и новее или Android Gradle plugin 8.0.0 и новее добавьте строку в android/gradle.properties:
Минимальная версия SDK – 21 или выше:
Для iOS в Runner → Info → Deployment target → iOS Deployment Target установите версию 13 или выше.
В ios/Podfile закомментируйте строку use_frameworks! (#use_frameworks!).
Для инициализации вызовите метод init. Название и путь к файлу лицензии должны совпадать с теми, которые вы указали в pubspec.yaml (например, assets/license.json).
Для подключения используйте полученные от нас логин, пароль и адрес API сервера.
На стадии коммерческого использования вместо логина и пароля мы рекомендуем использовать токен доступа, который можно получить с помощью метода API /api/authorize/auth.
По умолчанию логи сохраняются вместе с данными по анализам. Если вы планируете хранить логи отдельно от этих данных, настройте отдельное подключение для :
или
Для запуска съемки и получения результата вызовите метод startLiveness:
Обратите внимание: для версий до 8.11 включительно метод для запуска называется executeLiveness. Он возвращает результат съемки.
Для получения результата съемки в версии 8.12 и новее подпишитесь на livenessResult, как показано ниже:
Размещенный ниже код поможет вам запустить анализы.
Создайте объект Analysis:
Запустите созданный анализ:
Если вы хотите запустить анализ для конкретной папки, укажите ее идентификатор:
Результат анализа запишется в массив объектов analysisResult.
Для анализа медиафайла, полученного не нашим SDK, используйте следующий код:
Итоговый блок кода (пример):
ozsdk:
git:
url: https://gitlab.com/oz-forensics/oz-mobile-flutter-plugin.git
ref: '8.8.2'assets
- assets/license.json // название файла лицензии должно совпадать с названием из папки assetsallprojects {
repositories {
google()
mavenCentral()
maven { url ‘https://ozforensics.jfrog.io/artifactory/main’ } // ссылка на репозиторий
}
}android.nonTransitiveRClass=falsedefaultConfig {
...
minSDKVersion 21
...
}await OZSDK.initSDK([<% название файла лицензии и путь к нему %>]);await OZSDK.setApiConnectionWithCredentials(<login>, <password>, <host>); await OZSDK.setApiConnectionWithToken(token, host);await OZSDK.setEventConnectionWithCredentials(<login>, <password>, <host>);await OZSDK.setEventConnectionWithToken(<token>, <host>);await OZSDK.startLiveness(<actions>, <use_main_camera>);Параметр
Тип
Описание
actions
List<VerificationAction>
Действия на видео
use_main_camera
Boolean
Если установлено True, используется основная камера, False – передняя
class Screen extends StatefulWidget {
static const route = 'liveness';
const Screen({super.key});
@override
State<Screen> createState() => _ScreenState();
}
class _ScreenState extends State<Screen> {
late StreamSubscription<List<Media>> _subscription;
@override
void initState() {
super.initState();
// подписка на результат liveness
_subscription = OZSDK.livenessResult.listen(
(List<Media> medias) {
// содержит медиафайл liveness
},
onError: (Object error) {
// обработка ошибок, чаще всего PlatformException
},
);
}
@override
Widget build(BuildContext context) {
// пропущено для сокращения образца кода
}
void _startLiveness() async {
// запустите экран съемки с помощью метода startLiveness
OZSDK.startLiveness(<list of actions>);
}
@override
void dispose() {
// cancel subscription
_subscription.cancel();
super.dispose();
}
}List<Analysis> analysis = [ Analysis(Type.quality, Mode.serverBased, <media>, {}), ];final analysisResult = await OZSDK.analyze(analysis, [], {});final analysisResult = await OZSDK.analyze(analysis, folderID, [], {});media = Media(FileTypedocumentPhoto, VerificationAction.oneShot, “photo_selfie”, null, <pat// замените VerificationAction.blank, если у вас используется другой жест Livenes
final cameraMedia = await OZSDK.executeLiveness([VerificationAction.blank], use_main_camera);
final analysis = [
Analysis(Type.quality, Mode.serverBased, cameraMedia, {}),
];
final analysisResult = await OZSDK.analyze(analysis, [], {});// замените VerificationAction.blank, если у вас используется другой жест Liveness
final cameraMedia = await OZSDK.executeLiveness([VerificationAction.blank], use_main_camera);
final biometryMedia = [...cameraMedia];
biometryMedia.add(
Media(
FileType.documentPhoto,
VerificationAction.blank,
MediaType.movement,
null,
<путь к референсному фото>,
null,
null,
MediaTag.photoSelfie,
),
);
final analysis = [
Analysis(Type.quality, Mode.serverBased, cameraMedia, {}),
Analysis(Type.biometry, Mode.serverBased, biometryMedia, {}),
];
final analysisResult = await OZSDK.analyze(analysis, [], {});
Поле
Тип
Описание
time_created
Timestamp
время создания объекта (кроме пользователя и компании)
time_updated
Timestamp
время изменения объекта
meta_data
Json
любые пользовательские поля
technical_meta_data
Json
технические поля, зарезервированные для работы модулей
Поле
Тип
Описание
company_id
UUID
код компании в системе
name
String
наименование компании в системе
Поле
Тип
Описание
user_id
UUID
код пользователя в системе
user_type
String
first_name
String
имя
last_name
String
фамилия
middle_name
String
отчество
String
email, который является логином пользователя
password
String
пароль, указывается при добавлении нового пользователя или при изменении пароля. Если роль пользователя не admin, необходимо указать поле password_old
can_start_analyze_*
String
company_id
UUID
код компании пользователя
is_admin
Boolean
is_service
Boolean
Поле
Тип
Описание
folder_id
UUID
код папки в системе
resolution_status
ResolutionStatus
статус последнего анализа папки
Поле
Тип
Описание
media_id
UUID
код медиа
original_name
String
оригинальное имя файла (в файловой системе клиента)
original_url
Url
HTTP-ссылка на файл на сервере API
tags
Array(String)
список тегов для этого файла
Поле
Тип
Описание
analyse_id
UUID
код анализа
folder_id
UUID
код папки
type
String
тип анализа (BIOMETRY\QUALITY\DOCUMENTS)
results_data
Json
данные результата анализа

Применять настройки рекомендуется при старте приложения.
Чтобы настроить интерфейс Oz Liveness, воспользуйтесь UICustomization. Полный список полей находится .
По умолчанию SDK использует локаль устройства. Чтобы сменить локаль, используйте код ниже:
Для запуска окна плагина следует воспользоваться методом open(options). Параметры:
options – объект с настройками:
token – (опционально) токен авторизации;
license – объект с информацией о лицензии;
licenseUrl – строка, содержащая путь к файлу лицензии;
lang – строка с идентификатором одного из подключенных языковых пакетов;
meta – объект, ключи которого являются названиями метаполей, а значения – их строковыми значениями. передаются в Oz API и могут быть использованы для получения результатов анализа или поиска;
params – объект с идентификаторами и значениями дополнительных параметров:
extract_best_shot: true/false – запуск выбора лучшего кадра в анализе ;
action – массив строк с идентификаторами действий, по которым будет проводиться проверка.
Доступные действия:
photo_id_front – фото лицевой стороны документа;
photo_id_back – фото обратной стороны документа;
video_selfie_left – поворот головы налево;
video_selfie_right – поворот головы направо;
video_selfie_down – наклон головы вниз;
video_selfie_high – поднятие головы вверх;
video_selfie_smile – улыбка;
video_selfie_eyes – моргание;
video_selfie_scan – сканирование;
video_selfie_blank – отсутствие действия, простое селфи.
video_selfie_best – специальное действие, которое извлекает из видео лучший кадр и выполняет анализ по нему вместо целого видео.
overlay_options – параметры отображения шаблона документа:
show_document_pattern: true/false – по умолчанию true, отображает картинку-шаблон, при значении false остается только прямоугольная рамка;
on_submit – callback-функция без аргументов, вызываемая после отправки пользовательских данных на сервер (не применяется в ).
on_capture_complete – callback-функция с одним аргументом, вызываемая по завершении съемки и возвращающая информацию о снятом видео. Пример возвращаемого объекта показан .
on_complete – callback-функция с одним аргументом, вызываемая после окончания проверки и возвращающая результат анализа (не применяется в режиме capture). Вид результата зависит от параметра Web Adapter result_mode. Описание результата .
on_result – callback-функция с одним аргументом, вызываемая раз в несколько секунд в процессе анализа и возвращающая промежуточный результат (не применяется в режиме capture). Вид результата зависит от параметра Web Adapter result_mode. Описание результата .
on_error – callback-функция с одним аргументом, вызываемая при ошибке во время съемки и возвращающая информацию об ошибке: код ошибки, сообщение, идентификатор телеметрии для журналирования.
on_close – callback-функция без аргументов, вызываемая по окончании проверки после закрытия окна плагина, как ручного, так и автоматического.
style – раздел для .
device_id – (опционально) идентификатор используемой камеры.
enable_3d_mask (с версии 1.2.1) – включает использование 3D-маски при съемке вместо овала. Параметр работает только при load_3d_mask= true в ; значение по умолчанию – false.
cameraFacingMode (добавлено в 1.4.0) – параметр, определяющий, какую камеру использовать; возможные значения: user (передняя камера), environment (задняя камера). Этот параметр работает только в том случае, когда для параметра use_for_liveness в не установлено значение. Если use_for_liveness установлено любое значение, cameraFacingMode игнорируется.
disable_adaptive_aspect_ratio (добавлено в 1.5.0) – выключает автоматическую подстройку соотношения сторон видео к соотношению сторон окна. Значение по умолчанию – False, при стандартных настройках видео подстраивается под ближайшее соотношение из списка: 4:3, 3:4, 16:9, or 9:16. Обратите внимание: для съемки видео на смартфонах нужна портретная ориентация.
get_user_media_timeout (добавлено в 1.5.0) – когда SDK не может получить доступ к камере, по истечении этого таймаута появится подсказка, как решить проблему. Значение по умолчанию – 40000 (мс).
С помощью следующих параметров (добавлены в 1.7.15) вы можете управлять поведением SDK при зависании getUserMedia():
get_user_media_promise_timeout_ms – по истечении установленного здесь таймаута (в мс) SDK вызовет ошибку или покажет инструкцию для пользователя. Этот параметр представляет собой объект с ключами: "platform_browser", "browser", "platform", "default"(приоритет соответствует последовательности).
get_user_media_promise_timeout_throw_error – определяет, что именно демонстрирует SDK после таймаута, ошибку (если true) или инструкцию (если false).
Пример:
OzLiveness.open({
lang: 'en',
action: [
'video_selfie_blank',
],
meta: { // если нужно, добавьте метаданные для папки
'transaction_id': 'your unique transaction identifier', // идентификатор транзакции для поиска через Oz API
'end_user_id': '<user_or_lead_id>',
'meta_key': 'meta_value',
},
on_result: function (result) {
console.log('on_result', result);
},
on_complete: function (result) {
console.log('on_complete', result);
},
on_close: function () {
console.log('on_close');
},
on_capture_complete: function (result) {
console.log('on_capture_complete', result);
}
});OzLivenessSDK.INSTANCE.getConfig().setCustomization(new UICustomization(
// параметры настройки верхней панели
new ToolbarCustomization(
R.drawable.ib_close,
new Color.ColorRes(R.color.white),
R.style.Sdk_Text_Primary,
new Color.ColorRes(R.color.white),
R.font.roboto,
Typeface.NORMAL,
100, // непрозрачность текста на верхней панели (в %)
18, // размер текста на верхней панели (в sp)
new Color.ColorRes(R.color.black),
60, // непрозрачность фона верхней панели (в %)
"Liveness", // текст на верхней панели
true // центрировать текст на верхней панели
),
// параметры настройки текста подсказки
new CenterHintCustomization(
50, // положение по вертикали (в %)
R.style.Sdk_Text_Primary,
R.drawable.bg_center_hint_badge,
new Color.ColorRes(R.color.color_surface),
100, // непрозрачность фона
14, // угловой радиус подложки
100 // непрозрачность текста
),
// параметры настройки анимации подсказки
new HintAnimation(
new Color.ColorRes(R.color.red), // цвет градиента
80, // непрозрачность цвета градиента (в %)
120, // размер квадрата, в который вписан значок анимации
false // скрывать ли анимацию
),
// параметры настройки рамки вокруг лица
new FaceFrameCustomization( GeometryType.RECTANGLE,
10, // угловой радиус для прямоугольника
new Color.ColorRes(R.color.error_red),
new Color.ColorRes(R.color.success_green),
100, // непрозрачность рамки (в %)
5, // ширина линии рамки (в dp)
3 // отступ от рамки до области для позиционирования лица (в dp)
),
// параметры настройки фона за рамкой
new BackgroundCustomization(
new Color.ColorRes(R.color.black),
60 // непрозрачность фона (в %)
),
// параметры настройки текста версии SDK
new VersionTextCustomization(
R.style.Sdk_Text_Primary,
R.font.roboto,
12, // размер шрифта текста версии (в sp)
new Color.ColorRes(R.color.white),
100 // непрозрачность текста версии (в %)
),
// параметры настройки дополнительной защиты от мошенничества
new AntiScamCustomization(
"Recording .. ",
R.font.roboto,
12,
new Color.ColorRes(R.color.text_color),
100,
R.style.Sdk_Text_Primary,
new Color.ColorRes(R.color.color_surface),
100,
14,
new Color.ColorRes(R.color.green)
),
// параметры настройки логотипа
new LogoCustomization(
new Image.Drawable(R.drawable.ic_logo),
new Size(176, 64)
)
)
);OzLivenessSDK.config.localizationCode = OzLivenessSDK.OzLocalizationCode.RUOzLivenessSDK.INSTANCE.getConfig().setLocalizationCode(OzLivenessSDK.OzLocalizationCode.RU);// подключение к серверу API
OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(HOST, TOKEN))
// настройка количества попыток обнаружить действие
OzLivenessSDK.config.attemptSettings = attemptSettings
// возможность отображения дополнительной информации для отладки (чтобы увидеть данные, нажмите на номер версии SDK)
OzLivenessSDK.config.allowDebugVisualization = allowDebugVisualization
// настройки журналирования
OzLivenessSDK.config.logging = ozLogging OzConfig config = OzLivenessSDK.INSTANCE.getConfig();
// подключение к серверу API
OzLivenessSDK.setApiConnection(OzConnection.fromServiceToken(HOST, TOKEN));
// настройка количества попыток обнаружить действие
config.setAttemptSettings(attemptSettings);
// возможность отображения дополнительной информации для отладки (чтобы увидеть данные, нажмите на номер версии SDK)
config.setAllowDebugVisualization(allowDebugVisualization);
// настройки журналирования
config.setLogging(ozLogging);OzLivenessSDK.config.customization = UICustomization(
// параметры настройки верхней панели
toolbarCustomization = ToolbarCustomization(
closeIconRes = R.drawable.ib_close,
closeIconTint = Color.ColorRes(R.color.white),
titleTextFont = R.font.roboto,
titleTextSize = 18,
titleTextAlpha = 100,
titleTextColor = Color.ColorRes(R.color.white),
backgroundColor = Color.ColorRes(R.color.black),
backgroundAlpha = 60,
isTitleCentered = true,
title = "Analysis"
),
// параметры настройки текста подсказки
centerHintCustomization = CenterHintCustomization(
textFont = R.font.roboto,
textColor = Color.ColorRes(R.color.text_color),
textSize = 20,
verticalPosition = 50,
textStyle = R.style.Sdk_Text_Primary,
backgroundColor = Color.ColorRes(R.color.color_surface),
backgroundOpacity = 56,
backgroundCornerRadius = 14,
textAlpha = 100
),
// параметры настройки анимации подсказки
hintAnimation = HintAnimation(
hintGradientColor = Color.ColorRes(R.color.red),
hintGradientOpacity = 80,
animationIconSize = 120,
hideAnimation = false
),
// параметры настройки рамки вокруг лица
faceFrameCustomization = FaceFrameCustomization(
geometryType = GeometryType.Rectangle(10), // 10 – радиус скругления углов
strokeDefaultColor = Color.ColorRes(R.color.error_red),
strokeFaceInFrameColor = Color.ColorRes(R.color.success_green),
strokeAlpha = 100,
strokeWidth = 5,
strokePadding = 3,
),
// параметры настройки фона за рамкой
backgroundCustomization = BackgroundCustomization(
backgroundColor = Color.ColorRes(R.color.black),
backgroundAlpha = 60
),
// параметры настройки текста версии SDK
versionTextCustomization = VersionTextCustomization(
textFont = R.font.roboto,
textSize = 12,
textColor = Color.ColorRes(R.color.white),
textAlpha = 100,
),
// параметры настройки дополнительной защиты от мошенничества
antiScamCustomization = AntiScamCustomization(
textMessage = "",
textFont = R.font.roboto,
textSize = 14,
textColor = Color.ColorRes(R.color.text_color),
textAlpha = 100,
backgroundColor = Color.ColorRes(R.color.color_surface),
backgroundOpacity = 100,
cornerRadius = 20,
flashColor = Color.ColorRes(R.color.green)
),
// параметры настройки логотипа,
// если лицензия предусматривает возможность его изменения
logoCustomization = LogoCustomization(
image = Image.Drawable(R.drawable.ic_logo),
size = Size(176, 64),
)
)В этом разделе вы узнаете, как снимать видео и отправлять его Oz API через ваш бэкенд.
Режим capture работает следующим образом:
1. Oz Web SDK снимает видео и передает его вашему web-приложению в виде последовательности кадров.
2. Web-приложение вызывает ваш бэкэнд и передает в него архив с кадрами.
3. После обработки видео ваш бэкэнд вызывает Oz API для выполнения анализов, после чего получает их результаты.
4. Ваш бэкэнд передает результаты обратно в web-приложение (опционально).
На стороне сервера необходимо сконфигурировать Web SDK для работы в режиме capture: установить параметру architecture в файле app_config.json значение capture.
В вашем web-приложении добавьте callback-функцию для обработки кадров при открытии плагина Web SDK:
OZLiveness.open({
... // другие параметры
on_capture_complete: function(result) {
// Код для обработки кадров / отправки его через ваш API, шаг 2 на схеме
}
})Структура получаемого объекта зависит от того, была ли обнаружена виртуальная камера.
{
"action": <action>,
"best_frame": <bestframe>,
"best_frame_png": <bestframe_png>,
"best_frame_bounding_box": {
"left": <bestframe_bb_left>,
"top": <bestframe_bb_top>,
"right": <bestframe_bb_right>,
"bottom": <bestframe_bb_bottom>
},
"best_frame_landmarks": {
"left_eye": [bestframe_x_left_eye, bestframe_y_left_eye],
"right_eye": [bestframe_x_right_eye, bestframe_y_right_eye],
"nose_base": [bestframe_x_nose_base, bestframe_y_nose_base],
"mouth_bottom": [bestframe_x_mouth_bottom, bestframe_y_mouth_bottom],
"left_ear": [bestframe_x_left_ear, bestframe_y_left_ear],
"right_ear": [bestframe_x_right_ear, bestframe_y_right_ear]
},
"frame_list": [<frame1>, <frame2>],
"frame_bounding_box_list": [
{
"left": <frame1_bb_left>,
"top": <frame1_bb_top>,
"right": <frame1_bb_right>,
"bottom": <frame1_bb_bottom>
},
{
"left": <frame2_bb_left>,
"top": <frame2_bb_top>,
"right": <frame2_bb_right>,
"bottom": <frame2_bb_bottom>
},
],
"frame_landmarks": [
{
"left_eye": [frame1_x_left_eye, frame1_y_left_eye],
"right_eye": [frame1_x_right_eye, frame1_y_right_eye],
"nose_base": [frame1_x_nose_base, frame1_y_nose_base],
"mouth_bottom": [frame1_x_mouth_bottom, frame1_y_mouth_bottom],
"left_ear": [frame1_x_left_ear, frame1_y_left_ear],
"right_ear": [frame1_x_right_ear, frame1_y_right_ear]
},
{
"left_eye": [frame2_x_left_eye, frame2_y_left_eye],
"right_eye": [frame2_x_right_eye, frame2_y_right_eye],
"nose_base": [frame2_x_nose_base, frame2_y_nose_base],
"mouth_bottom": [frame2_x_mouth_bottom, frame2_y_mouth_bottom],
"left_ear": [frame2_x_left_ear, frame2_y_left_ear],
"right_ear": [frame2_x_right_ear, frame2_y_right_ear]
}
],
"from_virtual_camera": null,
"additional_info": <additional_info>
}{
"action": <action>,
"best_frame": null,
"best_frame_png": null,
"best_frame_bounding_box": null,
"best_frame_landmarks": null
"frame_list": null,
"frame_bounding_box_list": null,
"frame_landmarks": null,
"from_virtual_camera": {
"additional_info": <additional_info>,
"best_frame": <bestframe>,
"best_frame_png": <best_frame_png>,
"best_frame_bounding_box": {
"left": <bestframe_bb_left>,
"top": <bestframe_bb_top>,
"right": <bestframe_bb_right>,
"bottom": <bestframe_bb_bottom>
},
"best_frame_landmarks": {
"left_eye": [bestframe_x_left_eye, bestframe_y_left_eye],
"right_eye": [bestframe_x_right_eye, bestframe_y_right_eye],
"nose_base": [bestframe_x_nose_base, bestframe_y_nose_base],
"mouth_bottom": [bestframe_x_mouth_bottom, bestframe_y_mouth_bottom],
"left_ear": [bestframe_x_left_ear, bestframe_y_left_ear],
"right_ear": [bestframe_x_right_ear, bestframe_y_right_ear]
},
"frame_list": [<frame1>, <frame2>],
"frame_bounding_box_list": [
{
"left": <frame1_bb_left>,
"top": <frame1_bb_top>,
"right": <frame1_bb_right>,
"bottom": <frame1_bb_bottom>
},
{
"left": <frame2_bb_left>,
"top": <frame2_bb_top>,
"right": <frame2_bb_right>,
"bottom": <frame2_bb_bottom>
},
],
"frame_landmarks": [
{
"left_eye": [frame1_x_left_eye, frame1_y_left_eye],
"right_eye": [frame1_x_right_eye, frame1_y_right_eye],
"nose_base": [frame1_x_nose_base, frame1_y_nose_base],
"mouth_bottom": [frame1_x_mouth_bottom, frame1_y_mouth_bottom],
"left_ear": [frame1_x_left_ear, frame1_y_left_ear],
"right_ear": [frame1_x_right_ear, frame1_y_right_ear]
},
{
"left_eye": [frame2_x_left_eye, frame2_y_left_eye],
"right_eye": [frame2_x_right_eye, frame2_y_right_eye],
"nose_base": [frame2_x_nose_base, frame2_y_nose_base],
"mouth_bottom": [frame2_x_mouth_bottom, frame2_y_mouth_bottom],
"left_ear": [frame2_x_left_ear, frame2_y_left_ear],
"right_ear": [frame2_x_right_ear, frame2_y_right_ear]
}
]
}
}Список переменных с их значениями приведен ниже.
Переменная
Тип
Описание
best_frame
String
Лучший кадр, JPEG в формате data URL
best_frame_png
String
Лучший кадр, PNG в формате data URL, необходим для защиты от подмены видеопотока с помощью виртуальной камеры
best_frame_bounding_box
Array[Named_parameter: Int]
Координаты прямоугольника, в который вписано лицо на лучшем кадре
best_frame_landmarks
Array[Named_parameter: Array[Int, Int]]
Координаты "ориентиров" лица (левый глаз, правый глаз, нос, рот, левое ухо, правое ухо) на лучшем кадре
frame_list
Array[String]
Все кадры в формате data URL
frame_bounding_box_list
Array[Array[Named_parameter: Int]]
Координаты прямоугольников, в которые вписано лицо на кадрах из frame_list в соответствующем порядке
frame_landmarks
Array[Named_parameter: Array[Int, Int]]
Координаты "ориентиров" лица (левый глаз, правый глаз, нос, рот, левое ухо, правое ухо) на кадрах из frame_list в соответствующем порядке
action
String
Код действия
additional_info
String
Информация о среде клиента
Видео, полученное через Oz Web SDK, – это последовательность кадров. Чтобы отправить его Oz API, поместите кадры в ZIP-архив, затем используйте метод POST {{host}}/api/folders (пройдите по ссылке для ознакомления с коллекцией Postman).
Вы можете получить из папки видео в формате MP4 video: вызовите метод /api/folders/{{folder_id}}, указав идентификатор папки. В JSON-ответе найдите preview_url в source_media. В preview_url содержится ссылка на видео. Из плагина получить MP4-видео нельзя (только в виде последовательности кадров).
При использовании архитектуры capture также необходимо добавить в запрос POST {{host}}/api/folders дополнительное поле additional_info. Оно нужно для сбора информации о среде клиента. Пример заполнения тела запроса:
"VIDEO_FILE_KEY": VIDEO_FILE_ZIP_BINARY
"payload": "{
"media:meta_data": {
"VIDEO_FILE_KEY": {
"additional_info": <additional_info>
}
}
}"Для передачи в Oz API используйте данные без кодирования в base64.
Журнал изменений API Core.
Исправили ошибки, из-за которых по запросу GET /api/folders/ могли возвращаться некорректные результаты.
Обновили API в рамках подготовки к внедрению новой функциональности.
Исправили ошибки.
Исправили ошибку, из-за которой при отправке поврежденного видео с помощью методов POST /api/instant/folders/ и POST /api/folders/ система возвращала “500 Internal Server Error”. Теперь возвращается “400 Bad Request”.
Обновили API в рамках подготовки к внедрению новой функциональности.
API 6 теперь поддерживает новые требования регулятора в Казахстане: может извлекать из видеороликов, на которых пользователь делает жесты, кадры с действиями.
Вы можете убрать права администратора у пользователя с ролью CLIENT ADMIN, изменив его роль на CLIENT с помощью метода PATCH /api/users/{{user_id}}.
Теперь вы можете создать сервисный токен для пользователя с ролью OPERATOR.
Повысили безопасность.
Оптимизировали API и улучшили его производительность.
Анализы теперь могут выполняться параллельно друг другу. Для включения опции установите значение true параметру OZ_ANALYSE_PARALLELED_CHECK_MEDIA_ENABLED в файле config.py (значение по умолчанию – false).
Вы можете выключить авторизацию для Instant API (режима работы без сохранения данных). Добавьте в файл конфигурации config.py параметр OZ_AUTHORIZE_DISABLED_STATELESS и установите ему значение true (значение по умолчанию – false).
Исправили ошибку, из-за которой видео в MP4 могло не проигрываться после скачивания из SDK.
Для запросов без авторизации теперь возвращается корректная ошибка.
Исправили ошибку, из-за которой временами появлялась ошибка 500. Это происходило, если в видео было слишком мало кадров. Добавили соответствующую проверку и сделали описания ошибок более информативными.
Улучшили производительность, сделали удобнее процесс установки, повысили безопасность.
Оптимизировали хранилище и базу данных.
Добавили новый способ отправки данных на анализ: единый запрос. Этот запрос включает в себя создание папки и назначение анализов в одном и том же запросе – все необходимые данные указываются в payload.
Добавили новый режим работы API, при котором данные запроса и ответа не сохраняются ни локально, ни в какой-либо базе данных. Instant API может использоваться и сам по себе, и с другими компонентами API.
Теперь можно комбинировать рабочие системы, использующие асинхронные методы или Celery worker (локальная обработка, обработка через Celery). Для каждой из комбинаций добавлена поддержка хранения в S3.
Повысили безопасность.
Прекратили поддержку RAR-архивов.
Временно не поддерживаем Active Directory. В будущих релизах планируем вернуть эту функциональность.
Длительность анализа теперь считается точнее.
Для роли CLIENT заменили флаги is_admin и is_service новыми ролями: CLIENT ADMIN и CLIENT SERVICE соответственно. Для установки роли воспользуйтесь параметром user_type.
Чтобы выписать сервисный токен для пользователя с помощью метода {{host}}/api/authorize/service_token/, убедитесь, что этому пользователю назначена роль CLIENT SERVICE. Токен для другого пользователя с такой ролью можно создать с помощью {{host}}/api/authorize/service_token/{user_id}.
Убрали атрибуты коллекции и персоны из COLLECTION.analysis.
Мы больше не записываем кадры в SHOTS_SET как отдельные объекты. Для сохранения одного из кадров вашего видео вы можете воспользоваться опцией "Лучший кадр".
Больше не поддерживаем установку через Podman.
Обновили методы API: Oz API 6.0.
Заменили параметры и точки входа:
PATCH users/{{user_id}}/ для смены пароля
POST /api/users/{{user_id}}/change-password
DELETE images|media/<media_id> для удаления фото персоны из коллекции
DELETE collections/<collection_id>/persons/<person_id>/images/<media_id>/
image_id, video_id и shots_set_id
media_id
analyse_id
analysis_id
can_start_analyse_biometry
can_start_analysis_biometry
can_start_analyse_collection
can_start_analysis_collection
can_start_analyse_documents
can_start_analysis_documents
can_start_analyse_quality
can_start_analysis_quality
expire_date в {{host}}/api/authorize/auth и {{host}}/api/authorize/refresh
access_token.exp из payload
session_id в {{host}}/api/authorize/auth и {{host}}/api/authorize/refresh
token_id
Оптимизировали потребление серверных ресурсов при проведении биометрического анализа.
API теперь может извлекать из видеороликов, на которых пользователь делает жесты, кадры с действиями. Доработка выполнена в связи с вводом новых регуляторных требований к биометрической идентификации в Казахстане. Требования к версиям других компонентов описаны здесь.
Подготовили новый шаблон отчета, который также соответствует этим требованиям.
Миниатюры для нового отчета генерируются на основе кадров с действиями.
Обновили коллекцию Postman. Опубликовали новую коллекцию здесь и на https://apidoc.ozforensics.com/.
Добавили метод проверки настроек таймзоны: GET {{host}}/api/config
Добавили параметры к методу GET {{host}}/api/event_sessions:
time_created
time_created.min
time_created.max
time_updated
time_updated.min
time_updated.max
session_id
session_id.exclude
sorting
offset
limit
total_omit
При создании папки с SHOT_SET соответствующее видео будет в media.video_url.
Исправили ошибку, из-за которой CLIENT ADMIN не мог установить новый пароль для пользователя из своей компании.
Обновления безопасности.
Добавили возможность сравнения лица с большой базой фотографий, содержащей миллион фото и более, – Face Identification 1:N.
Анализ Liveness (QUALITY) теперь игнорирует фото с тегами photo_id, photo_id_front или photo_id_back.
Обновления безопасности.
Анализ 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.
Обновления безопасности.
Настроили авторотацию логов.
Добавили консольную команду для удаления пользователя.
Генерацию предпросмотра видео теперь можно отключить.
Токен доступа для роли ADMIN теперь действителен 5 лет.
Добавили идентификатор папки folder_id к названию отчета.
Исправили ошибки и оптимизировали работу API.
Система теперь удаляет ненужные кадры, оставшиеся после раскадровки видео.
Добавили новые методы 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 добавили журналирование.
Обновили алгоритм удаления компании.
Улучшили логику обработки черных списков.
Исправили несколько багов.
Модули Photo Expert и KYC удалены.
Обновили конечную точку для изменения пароля пользователя: POST users/user_id/change-password вместо PATCH.
Доступен лог для Celery.
Добавили в параметры запроса Folder [LIST] фильтры: analyse.time_created, analyse.results_data для анализа Documents, results_data для анализа Biometry, results_media_results_data для анализа QUALITY. Для включения фильтра установите True в параметре запроса with_results_media_filter.
Добавили новый атрибут для пользователей – is_active (по умолчанию True). Если выставлено False, пользователь не может совершать никакие действия.
Добавили новую ошибку, которая выводится в ответ на попытку заблокированного пользователя что-либо сделать.
Добавили превью наборов изображений.
Теперь наборы можно сохранять на диск через атрибуты original_local_path, original_url.
Добавили атрибут original_info для набора изображений – в нем хранятся сумма md5, размер, mime-тип.
Исправили отчет для наборов изображений.
Добавили “проверку здоровья” системы - метод GET api/healthcheck. Можно задать перечень имен / очередей задач на проверку активности.
Поправили ссылку на миниатюру для набора изображений.
Первое изображение в наборе теперь устанавливается как миниатюра для превью набора.
Поменяли политики – максимальное количество попыток анализа увеличили до 3 и ввели настраиваемую задержку.
Поменяли алгоритм вызова callbacks.
Переработали и описали инструменты командной строки.
Провели рефакторинг модулей.
Поменяли подметод и метод для удаления персональных данных – с delete_pi на /pi и с POST на DELETE соответственно.
Улучшили алгоритм удаления персональных данных.
В папки, которые были очищены, теперь нельзя добавлять медиа.
Поменяли название подметода авторизации с auth на auth_restore.
Добавили тег video_selfie_oneshot.
Добавили настройки валидации пароля.
Добавили задержки для auth, rest_unauthorized, rps_with_token (OZ_THROTTLING_RATES в настройках, по умолчанию отключено).
Теперь можно проверять доступы пользователя к статичным файлам (OZ_USE_PERMISSIONS_FOR_STATIC в настройках, по умолчанию – False).
Добавили новый подметод для заявки - /delete_pi. С его помощью можно удалить в заявке все персональные данные и связанные с ними анализы.
Добавили ошибку, которая появляется при попытке синхронизировать пустые коллекции.
Добавили параметр fields_to_check к анализу документов (по умолчанию проверяет все поля).
Добавили параметр double_page_spread к анализу документов (по умолчанию включен).
Поправили синхронизацию коллекций.
Теперь можно продлить токен авторизации с помощью expire_token.
Добавили поддержку application/x-gzip.
Переименовали shots_set.images в shots_set.frames.
Добавили набор функций по управлению сессиями пользователя.
Пользователи могут менять владельцев заявок (в соответствии со своими доступами).
Поменяли правила зависимостей.
Поправили баг с продлением авторизации.
Переместили функционал синхронизации коллекций в oz_core.
Упростили работу с наборами изображений. Один набор – один архив.
Улучшено распознавание документов для Dockered-версии.
Переместили проверку тега ориентации в анализ Quality.
Добавили шаблон отчета по умолчанию для ролей Admin и Operator.
Обновили биометрическую модель.
Исправили ошибку с созданием объекта набора изображений без изображений.
Добавили новый формат обмена данными для модуля распознавания документов.
Если для персон в коллекции проводились какие-либо анализы, коллекцию теперь нельзя удалить.
Добавили к анализам временные метки time_task_send_to_broker, time_task_received, time_task_finished.
Добавили новый механизм авторизации – соединение с Active Directory через LDAP.
Добавили новый тип медиа в заявку: "shots_set"
Персону в коллекции теперь нельзя удалить, если с ней производились какие-либо анализы.
Переименовали поле заявки resolution_suggest в operator_status.
Добавили к заявке текстовое поле operator_comment.
Доступ на редактирование полей заявки operator_status и operator_comment есть у Admin, Operator, Client Service, Client Operator и Client Admin.
Доступ на удаление заявки, медиа из заявки, шаблонов отчетов и их вложений, самих отчетов и анализов теперь есть только у Admin и Client Admin (в рамках компании).
Исправили удаление отчетов – теперь они удаляются при удалении их автора.
Поправили доступы – Client теперь может просматривать только свой профиль.
Client Operator теперь может редактировать только свой профиль.
Client больше не может удалять свои заявки, любые медиа, отчеты или анализы.
Client Service может создавать персон в коллекциях и просматривать отчеты в рамках компании.
У ролей Client, Client Admin, Client Operator теперь есть доступы на просмотр профилей пользователя только внутри компании.
Запустили альфа/бета-тестирование.
Теперь поддерживаем заголовок с датой просрочки токена авторизации.
Добавили поддержку модуля распознавания документов для стенделона и Docker.
Добавили роль Client Operator – это Client Admin, но без доступа к управлению аккаунтом и компанией.
И Client Admin, и Client Operator могут менять статус анализа.
Создавать, редактировать и удалять что-либо в моделях Collection и CollectionPerson в рамках компании теперь могут только Admin и Client Admin.
При создании отчета по заявке теперь проверяются доступы пользователя к шаблонам.
Поправили код статуса, который возвращается при создании коллекции, с 200 на 201.
Журнал изменений Web SDK.
Web SDK больше не вылетает с ошибкой, когда вы вызываете метод OzLiveness.hide() сразу после запуска плагина.
Улучшили производительность.
Повысили безопасность.
Web Plugin теперь можно запустить в оконном режиме. Установите нужное значение parent_container в OpenOptions: parent_container: string | HTMLElement.
Добавили возможность настройки переходов для loader. Соответствующие настройки приведены здесь.
SDK теперь лучше работает с жестами наклона и подъема головы.
Исправлена проблема с чрезмерным количеством сообщений об ошибках в консоли.
Обновили телеметрию.
Повысили безопасность.
Вы можете настроить собственный loader вместо используемого по умолчанию. Соответствующие настройки приведены здесь.
Вы можете управлять поведением SDK, если получение доступа к камере занимает слишком много времени. Воспользуйтесь настройками get_user_media_promise_timeout_*, приведенными здесь.
Повысили безопасность и улучшили телеметрию.
Критические изменения: мы больше не передаем в коллбэках значения оценок. confidence_spoofing нужно заменить на 0 для SUCCESS и на 1 для других статусов.
Исправили ошибку чтения свойств image_data_tensor.
Исправили ошибку, из-за которой OzLiveness иногда вызывался позже, чем нужно.
Обновление безопасности.
Добавили поддержку API 6.0.
При настройке конфигурации сервера переменные в заголовках CORS теперь указываются без кавычек.
Добавили новый параметр auth , который указывает, используется ли авторизация, и если да, то каким способом:
true (по умолчанию) – включена авторизация на базе генерируемого ключа доступа;
user:pass – включена авторизация на базе логина и пароля;
false – авторизация выключена.
Настройки цвета для 3D-маски теперь работают корректно.
Зеркалирование при отключенном use_for_liveness теперь также работает корректно.
Поправили ошибку, из-за которой не выполнялось сканирование документа в плагине.
Улучшили работу озвучки SDK: экранные дикторы читают подсказки по мере прохождения проверок (доступ к камере, загрузка и обработка данных, запрос результата) правильнее и при переключении подсказок реагируют быстрее.
Добавили возможность проверки лицензии: [GET] /check_license.php.
Уменьшили размер загружаемых компонентов.
Результаты анализа в коллбэке on_complete при result_mode: full теперь передаются корректно.
Исправили ошибку, из-за которой кнопка переключения камеры могла не отображаться.
Передняя камера больше не отзеркаливает действия пользователя.
Улучшили обработку ошибок.
SDK теперь лучше работает на устройствах с низкой производительностью.
Добавили проверку на закрытые глаза для жеста Scan.
Исправили ошибки, повысили безопасность, обновили телеметрию и улучшили работу SDK в целом.
Упрощены проверки, требующие от пользователя движения головы: актуально для жестов поворота головы влево или вправо, наклона головы вперед или назад.
Пороговая дистанция для жестов, связанных с движением головы, была снижена: актуально для жестов поворота головы влево или вправо, наклона головы вперед или назад.
Поведением приложения при обнаружении открытых инструментов разработчика теперь можно управлять.
Теперь можно настроить сигнатуры методов с помощью контрольной суммы измененной функции, чтобы сделать их доверенными.
Исправлена ошибка, из-за которой на экране съёмки после захвата жестов с движением головы неверно отображалась стрелка.
Исправлена ошибка, из-за которой на экране съёмки при отображении фразы "Отлично!" исчезал овал.
Улучшен поиск лучшего кадра.
Обновления безопасности.
Обновления безопасности.
Исправили ошибку, из-за которой видео могло некорректно создаваться из последовательности кадров.
Коллбэк-функция 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.
Если доступ к камере отсутствует в течение длительного времени, пользователям теперь показывается инструкция, как его включить. Для всех браузеров, кроме Facebook, отображается инструкция по умолчанию, для Facebook – отдельная.
Добавили несколько записей в файл локализации Web SDK. Новые ключи локализации:
accessing_camera_switch_to_another_browser,
error_camera_timeout_instruction,
error_camera_timeout_title,
error_camera_timeout_android_facebook_instruction.
Улучшили работу с картоматами: расстояние, на котором может распознаваться лицо пользователя, увеличено.
Добавили в 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-маска не реагировала на лицо.
Обновления безопасности и журналирования.
Исправили ошибку, из-за которой при съемке лица в горизонтальной ориентации на мобильных устройствах не показывалось предупреждение о необходимости поворота устройства вертикально.
У некоторых пользователей ранее наблюдались зависания при использовании WebView. Теперь в этих случаях пользователь может нажать кнопку, чтобы продолжить работу с приложением. В связи с этим обновили файл со строками в разделе локализации. Ключ: tap_to_continue.
Расширили возможности отладки.
Крупные обновления безопасности: улучшили защиту от виртуальных камер и модификации 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
Web SDK теперь работает и с черным списком: вы можете сравнить лицо из снятого Liveness-медиафайла с лицами из вашей базы данных. Создайте коллекцию (или коллекции) с нужными фотографиями через API или веб-интерфейс и добавьте соответствующий идентификатор (или идентификаторы) в массив analyses.collection_ids в файле конфигурации веб-адаптера.
Мы вернули поддержку iframe: установите для параметра iframe_allowed в файле конфигурации Web Adapter значение True.
Интервал опроса для получения результатов анализов теперь можно настраивать. При необходимости измените его в параметре results_polling_interval файла конфигурации Web Adapter.
Теперь вы можете выбрать, какую камеру использовать, переднюю или заднюю, и через веб-плагин. В методе OzLiveness.open() установите для cameraFacingMode значение user для передней камеры и environment для задней. Этот параметр работает только в том случае, если для параметра use_for_liveness в файле конфигурации веб-адаптера не установлено значение.
Стили плагина теперь добавляются автоматически. Обратите внимание: удалите стили, которые вы ранее применили к странице клиента вручную (строка <link rel="stylesheet" href="/plugin/ozliveness.css" />), чтобы избежать конфликтов.
Исправлены некоторые ошибки и улучшено журналирование.
Улучшили защиту против инъекционных атак.
Заменили идентификатор языка для бразильского португальского с pt на pt-br согласно стандарту ISO.
Удалили конфигурационный параметр lang_default.
Прозрачность 3D-маски теперь можно настраивать.
Добавили возможность использования мастер-лицензии, которая работает без ограничений по домену.
Добавили параметр master_license_signature в параметры конфигурации Web Adapter.
Исправили ошибки.
Улучшили работу SDK.
Добавили 3D-маску, которая заменяет овал при съемке видео нашим SDK. Для включения маски установите конфигурационному параметру load_3d_mask значение true.
Обновили телеметрию (журналирование).
Обновления журналирования.
Обновления безопасности.
Улучшили работу SDK.
Улучшили работу SDK.
Исправили ошибки.
Изменили сигнатуру коллбэка on_error(): теперь он возвращает не только код ошибки, но и сообщение, а также идентификатор телеметрии для журналирования.
Добавили параметр конфигурации для режима debug. Если он принимает значение True, в Web SDK можно открыть страницу /debug.php, на которой размещена информация о текущих конфигурации и лицензии.
Исправили несколько ошибок и улучшили журналирование.
Добавили возможность выбора камеры при запуске плагина (если на устройстве их несколько).
Полностью переделали дизайн для SDK и демо, в том числе добавили настройки защиты от мошенников: при включении опции во время записи видео появляется дополнительное сообщение. Новые возможности настройки интерфейса описаны здесь.
Перевели SDK на португальский, испанский и казахский языки.
Добавили жест Комбо.
Добавили шкалу прогресса для загрузки медиа.
Жесты Zoom in и Zoom out больше не поддерживаются.
Съемка видео в альбомной ориентации теперь работает корректно для планшетов.
Убрали опцию lang_allow из файла конфигурации Web Adapter.
В архитектуре capture при обнаружении виртуальной камеры параметр additional_info теперь отображается внутри списка from_virtual_camera.
Добавили возможность обрезать кадр с лицом без потери качества.
Координаты "ориентиров" лица для архитектуры capture теперь передаются корректно.
Улучшили качество съемки;
Значительно переработали лицензирование:
добавили описание ошибок, теперь понятно, что и почему произошло;
теперь можно указывать лицензию в 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 выводятся фактические параметры конфигурации.
Изменили расширение некоторых файлов системы Oz Forensics с .bin на .dat.
Ссылки на дополнительные скрипты теперь формируются с использованием адреса основного скрипта.
Добавили возможность распространять Web SDK только статическими файлами, без адаптера (в режиме capture).
Web SDK теперь может работать с CDN.
Теперь можно запускать несколько экземпляров Oz Liveness Web Plugin на разных страницах, в этом случае необходимо указать на этих страницах путь для загрузки скриптов.
Исправили ошибку экрана съемки.
Добавили лицензирование, для получения лицензии необходим origin.
Внешний вид Web SDK теперь можно настраивать.
Исправили ошибки интеграции с Angular.
Исправили ошибку с отсутствием секции IMAGE_FOLDER в JSON-ответе при включенном lossless-кадре.
Исправили ошибки работы с библиотекой ravenjs.
Рамку для фото документов теперь можно настроить.
Повысили безопасность SDK.
Названия всех доступных пользователю камер теперь добавляем в метаинформацию.
В формате видео / режиме zip теперь можно загружать lossless-кадр.