---
title: Тихая ревалидация
description: Использует движок Тихая ревалидация, который анализирует поведенческий контекст пользователя в рамках сетевого эффекта Unico и выдаёт сигнал уверенности для текущей транзакции. Другими словами, мы предоставляем уровень уверенности в том, что это именно тот пользователь, который ожидается в транзакции.
canonical: https://developer.unico.io/ru/developers/sdks-and-tools/flutter/capture-flow/capture-types/silent-revalidation
locale: ru
generated_by: markdown-export
---

Использует движок Тихая ревалидация, который анализирует поведенческий контекст пользователя в рамках сетевого эффекта Unico и выдаёт сигнал уверенности для текущей транзакции. Другими словами, мы предоставляем уровень уверенности в том, что это именно тот пользователь, который ожидается в транзакции.

:::info[Требование]
Минимальная версия: `4.62.0`
:::

## Атрибуты UnicoCheckPrepareInfo

| Атрибут | Тип | Обязательно | Описание |
|---|---|:-:|---|
| `externalUserId` | `String` | ✅ | Идентификатор пользователя в вашей системе. Автоматически хешируется с помощью SHA-256 перед передачей, никогда не отправляется в открытом виде. |

## Запуск тихой ревалидации

****Шаг 1** — Реализуйте `initializeSDK` в нативном коде**

`initializeSDK` не предоставляется в Dart. Он должен выполняться до запуска движка Flutter, поэтому вы вызываете его в нативном коде вашего приложения — `Application.onCreate` на Android и `application(_:didFinishLaunchingWithOptions:)` на iOS.

  :::warning[Вызывайте его при запуске приложения]
  `UnicoSDK.initializeSDK` должен вызываться как можно раньше при запуске приложения. Более поздний вызов сокращает время фоновой обработки и увеличивает вероятность неопределённых ответов аутентификации.
  :::

  ### Android

    ```kotlin
    import android.app.Application
    import com.acesso.acessobio_android.onboarding.UnicoSDK
    import com.acesso.acessobio_android.onboarding.models.Environment
    import com.acesso.acessobio_android.onboarding.models.UnicoSDKConfig

    class MainApplication : Application() {
        override fun onCreate() {
            super.onCreate()

            UnicoSDK.initializeSDK(
                this,
                UnicoSDKConfig(
                    sdkKey = "your_sdk_key",
                    bundleId = "your_bundle_id",
                    environment = Environment.UAT
                )
            )
        }
    }
    ```

    Зарегистрируйте класс в `android/app/src/main/AndroidManifest.xml`:

    ```xml
    <application android:name=".MainApplication">
    ```

    Плагин предоставляет нативный SDK захвата вашему приложению, поэтому `UnicoSDK` уже находится в вашем classpath компиляции — дополнительная зависимость в `android/app/build.gradle` не нужна.

### iOS

    ```swift
    import AcessoBio
    import Flutter
    import UIKit

    @main
    class AppDelegate: FlutterAppDelegate {
        override func application(
            _ application: UIApplication,
            didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
        ) -> Bool {
            UnicoSDK.initializeSDK(config: YourUnicoConfig(), environment: .UAT)

            GeneratedPluginRegistrant.register(with: self)
            return super.application(application, didFinishLaunchingWithOptions: launchOptions)
        }
    }
    ```

    `config` — это `AcessoBioConfigDataSource` — `sdkKey` берётся из `getHostKey()`, а bundle — из `getBundleIdentifier()`:

    ```swift
    final class YourUnicoConfig: NSObject, AcessoBioConfigDataSource {
        func getBundleIdentifier() -> String { "your_bundle_id" }
        func getHostKey() -> String { "your_sdk_key" }
    }
    ```

  Если `environment` не указан, по умолчанию используется production.

****Шаг 2** — Реализуйте `startSilentValidation`**

После `initializeSDK` свяжите уже выполняющийся сбор данных с идентифицированным пользователем, вызвав `startSilentValidation` с `UnicoCheckPrepareInfo`, содержащим `externalUserId`.

  ```dart
  import 'package:unico_check/unico_check.dart';

  try {
    await UnicoSilentAuthDefault().startSilentValidation(
      UnicoCheckPrepareInfo(externalUserId: 'external_user_id'),
    );
  } on UnicoError catch (error) {
    // error.code, error.description, error.info
  }
  ```

  Возвращаемый `Future` завершается, когда валидация успешно запущена, и выбрасывает `UnicoError` в случае сбоя.

  Если валидация происходит в начале потока, например при входе в систему, дождитесь завершения `Future`, прежде чем переходить к Шагу 3.

  ## Ошибки

  | Код | Смысл |
  |---|---|
  | `75001` | SDK не инициализирован. `initializeSDK` не был вызван, ещё не завершился или завершился с ошибкой. |
  | `75000` | Общая ошибка захвата. |

  `UnicoError.info` содержит шаг потока, который завершился с ошибкой. Он предоставляется на iOS и всегда равен null на Android.

****Шаг 3** — Создайте процесс и выполните аутентификацию**

Пока валидация выполняется, создайте процесс верификации для завершения аутентификации. См. [Справочник API ▸ API ▸ Создание процесса](/developers/api-reference/api/post-processes).

  Включите в тело запроса тот же `externalUserId`, который был отправлен в `UnicoCheckPrepareInfo` на Шаге 2 — именно это позволяет бэкенду сопоставить создание процесса с уже выполняющейся валидацией.

  ```bash
  curl -X POST https://api.id.unico.app/processes/v1 \
    -H "Authorization: Bearer $TOKEN" \
    -H "APIKEY: $API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "subject": {
        "duiType": 1,
        "code": "12345678909",
        "name": "Luke Skywalker",
        "gender": "M",
        "birthDate": "2000-05-20",
        "email": "luke@example.com",
        "phone": "5519725570707"
      },
      "useCase": "Onboarding",
      "externalUserId": "external_user_id"
    }'
  ```

  Ответ содержит поле `silentAuth.result` с результатом аутентификации:

  ```json
  {
      "id": "80371b2a-3ac7-432e-866d-57fe37896ac6",
      "status": 3,
      "silentAuth": {
          "result": "yes"
      }
  }
  ```

  | Поле | Тип | Описание |
  |---|---|---|
  | `silentAuth.result` | string | `yes` или `no` — см. возможные значения ниже. |

  <details>
  **`silentAuth.result` — возможные значения**

  | Значение | Смысл |
  |---|---|
  | `yes` | Аутентификация одобрена, пользователь распознан с достаточной уверенностью, дополнительный захват не требуется. |
  | `no` | Недостаточно данных для одобрения в тихом режиме. Рекомендуется аутентификация с помощью биометрии (селфи) или другого альтернативного метода. |

</details>