Реалізація верифікації документів у мобільному додатку
Верифікація документів через мобільну камеру — стандарт для фінтех та KYC-процесів. Користувач фотографує паспорт, водійське посвідчення або закордонний паспорт, додаток розпізнає дані та перевіряє автентичність. Реалізація складніша, ніж здається: якість зйомки, виявлення підробок та точність OCR створюють ланцюг точок відказу.
Детекція та якість документа перед OCR
Перший етап — переконатися, що документ потрапив у кадр правильно, без бліків та розмазування. Показувати користувачу повідомлення «занадто темно» або «нахиліть телефон» важливіше хорошого OCR — сміття на вході дає сміття на виході.
На iOS для real-time детекції прямокутника документа — Vision.VNDetectRectanglesRequest:
let request = VNDetectRectanglesRequest { request, error in
guard let observations = request.results as? [VNRectangleObservation],
let doc = observations.first else { return }
// Перевіряємо confidence та aspect ratio для паспорта
if doc.confidence > 0.9 && isValidDocumentAspectRatio(doc) {
// Захоплюємо кадр
captureDocument(rect: doc)
}
}
request.minimumConfidence = 0.8
request.minimumAspectRatio = 0.5
Для перевірки бліку — аналіз яркості через CIFilter.glassDistortion або користувацький Metal-шейдер. Наявність specular highlights (білі плями на ламінованій поверхні паспорта) — типова причина відказу OCR приблизно в 15% випадків.
На Android — CameraX + MLKit DocumentScanner API (з'явився у 2024) або OpenCV для детекції прямокутників через Imgproc.findContours.
OCR: платформні vs спеціалізовані SDK
Apple Vision (VNRecognizeTextRequest) — хороша якість для латиниці та кирилиці, працює on-device:
let textRequest = VNRecognizeTextRequest { request, _ in
let observations = request.results as? [VNRecognizedTextObservation] ?? []
let lines = observations.compactMap { $0.topCandidates(1).first?.string }
parseDocumentFields(from: lines)
}
textRequest.recognitionLevel = .accurate
textRequest.recognitionLanguages = ["ru-RU", "en-US"]
textRequest.usesLanguageCorrection = true
Google ML Kit Text Recognition v2 — на Android, підтримує латиницю, кирилицю, деванагарі та ще кілька скриптів. Працює on-device.
Спеціалізовані SDK: Regula Document Reader, ABBYY Mobile Capture, Scandit. Коштують грошей, але дають кращу точність на MRZ (Machine Readable Zone) паспортів та розуміють структуру конкретних документів. Regula, наприклад, знає формати паспортів 240+ країн.
MRZ: найцінніше
Machine Readable Zone — два рядки з OCR-оптимізованим шрифтом OCR-B в нижній частині паспорта або ID-карти. Саме звідти вилучаються: ім'я, номер документа, дата народження, термін дії, громадянство.
Парсинг MRZ за стандартом ICAO 9303 (реалізація — відкриті бібліотеки NFCPassportReader на iOS або MRZParser на Android):
// MRZ рядок: P<RUSLASTNAME<<FIRSTNAME<<<<<<<<<<<<<<<
// Рядок 2: PA1234567<8RUS9001011M2512310<<<<<<<<<6
struct MRZData {
let documentNumber: String
let lastName: String
let firstName: String
let nationality: String
let dateOfBirth: Date
let expiryDate: Date
let gender: Character
var isChecksumValid: Bool {
// Перевірка контрольних цифр за ICAO 9303
validateMRZCheckDigits(line2: rawLine2)
}
}
Контрольні суми в MRZ — простий спосіб перевірити, що дані не повреджені при OCR. Якщо checksum не збігається — перечитати документ, не надсилати на сервер.
NFC-верифікація біометричних паспортів
Нові паспорти (ICAO LDS1) містять NFC-чип з біометричними даними та цифровим підписом країни-емітента. Читання чипу — надійніша верифікація, ніж OCR.
На iOS (CoreNFC, NFCTagReaderSession):
// Basic Access Control: ключ формується з MRZ
let bacKey = BACKey(documentNumber: mrz.documentNumber,
dateOfBirth: mrz.dateOfBirth,
dateOfExpiry: mrz.expiryDate)
let nfcReader = NFCPassportReader()
nfcReader.readPassport(mrzKey: bacKey.key,
tags: [.DG1, .DG2, .SOD]) { result in
switch result {
case .success(let passport):
let photo = passport.passportImage // UIImage з DG2
let isValid = passport.documentSigned // перевірка сертифіката CSCA
case .failure(let error):
handleNFCError(error)
}
}
NFC доступна тільки на фізичних пристроях, iPhone 7+. На Android — NfcAdapter з PACE/BAC.
Серверна валідація
OCR-дані з клієнта — завжди недовіренні. Фінальна верифікація відбувається на сервері: порівняння фото документа з селфі користувача через face matching API (Amazon Rekognition, Azure Face, або ГАРАНТ/Паспорт-сервіс для російських документів).
Процес реалізації
Визначте типи документів та країни. Виберіть SDK (Vision/ML Kit vs спеціалізовані). Реалізуйте capture-flow: детекція, перевірка якості, захоплення. OCR + парсинг полів. NFC-верифікація (якщо потрібна). Серверна валідація з face matching. Тестування на колекції реальних документів різної якості.
Орієнтири за часом
Базовий OCR паспорта (MRZ + основні поля) — 1–2 тижні. Повний KYC-flow з NFC, face matching, підтримкою кількох типів документів — 6–10 тижнів.







