Integration
Description
The AwareID Document Capture SDK is the client side library that is used with the Face Liveness and Document Authentication Server products. It is used to capture face and document images then package them according to the Face Liveness and Document Authentication Server specifications. These packages are controlled by the application allowing the developer to control the timing and delivery methods for each transaction. It is up to the application developer to implement any server communication and security.
On the back-end, the Face Liveness service will determine whether the subject is live or not. The Document Authentication server will take the captured document to determine the validity of the document then perform a match with the live face and the facial image from the document to authenicate the user.
Design Features
- Easy to integrate API
- Customizable user experience
- Handles operation of device hardware
- Optimized data collection for back-end analysis
- Applications have full control over when and how they interact with the back-end services.
Platforms
- Android 8.0 and higher
Integration Requirements
The Face Capture SDK requires Camera permissions.
The Regula Document Reader SDK requires Internet, Camera, and NFC Tag Reading permissions. Please see Regula’s documentation for additional details : https://docs.regulaforensics.com/develop/doc-reader-sdk/mobile/android/
Add Capabilities and Permissions
Android
Place Aware Face Capture AAR bundles in the application at the following location:
/app/libs/Aware-FaceCaptureAwareId.aar /app/libs/Aware-FaceCaptureAwareId-DeviceControl.aar
Permissions for camera access and internet access should be requested in the manifest at the following location:
/android/app/src/main/AndroidManifest.xml
Setup permissions¶
<manifest xmlns:android="http://schemas.android.com/apk/res/android" //... <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
Setup dependencies¶
// Regula implementation 'com.regula.btdevice:api:1.0+@aar' implementation 'com.regula.documentreader.core:fullrfid:6.8.+@aar' // use fullauthrfid core for 7310 implementation('com.regula.documentreader:api:6.8.+@aar') { transitive = true }
Capture Face
Overview
Face Capture SDK is used to capture the subject’s face. This chapter details the steps required to set up a facial capture, obtain data from the capture session, and get the package contents for the Face Liveness back-end.
Face Capture Integration
Create a Face Capture Object
The Face Capture library object manages all other Face Capture API classes, and methods. This object is used to set up a capture session and allow control of the face capturing process. A JSON package can be retrieved using this object following the completion of the face capture.
Android
Create a Face Capture Object¶
FaceCaptureJNI mFaceCapture = new FaceCaptureJNI();
Create a Workflow Object
The workflow object allows the developer to customize a capture session. The core workflow parameters are selected by specifying the workflow name. A workflow object combined with a camera are provided to the Face Capture library to control the capture session. The wokflow object may be configured with several options shown in the Face Capture documentation.
Android
Create a Workflow Object¶
mWorkFlow = mFaceCapture.workflowCreate(FaceCaptureJNI.FOXTROT);
Select a Camera
Get the list of cameras on the front or back of the phone and select one to use. Cameras can be set up as either portrait or landscape.
Android
Select a camera¶
IFaceCapture.ICamera[] mCameraList = null; mCameraList = mFaceCapture.getCameraList(CameraPosition.FRONT); //Get camera IDs on front of device. mCameraList[0].setOrientation(CameraOrientation.PORTRAIT); //Set the orientation on camera 0.
Begin a Capture Session
In order to receive facial images and feedback, the capture session must be started. The capture session is initiated by calling startCaptureSession with the selected workflow and camera. Not all camera and workflow combinations are valid. Details are available in the Face Capture documentation.
Android
Begin a Capture Session¶
mFaceCapture.startCaptureSession(mWorkFlow, mCameraList[0]);
Get the Capture Region
While a capture session is on-going, a capture region based on the capture session’s settings becomes available. This region is where the face needs to be positioned in order to successfully capture. This should be used to create a display for the user to align themselves with.
Android
Get capture region¶
Rectangle mCurrentCaptureRegion; mCurrentCaptureRegion = mFaceCapture.captureSessionGetCaptureRegion();
Enable Autocapture
Disabling and enabling this setting allows customizing when a capture can occur easily. The capture session will not successfully complete while this setting is disabled even if the subject meets all capture requirements.
Android
Enable Autocapture¶
mFaceCapture.captureSessionEnableAutocapture(true);
Get the current Capture Session State
While a capture session is in progress, the application retrieves the capture session state object using the getCaptureSessionState() function. The getCaptureSessionState() function waits for new data to be available and then returns. This is a blocking function, therefore, it needs to be in a separate thread to avoid deadlocking other application functionality such as the UI thread.
Android
Capture Session State¶
mCurrentCaptureState = mFaceCapture.getCaptureSessionState();
Get the Capture State’s Status
The status indicates what the capture session is currently doing or if it has ended. The main use of the capture status is to know when to determine what content to display on screen and when to move to the next screen.
Android
Capture State’s Status¶
mCurrentCaptureSessionFrame = mCurrentCaptureState.getStatus();
Get the Capture State’s Image
While the capture status is capturing, images from the camera are available to display on screen. When a capture session has ended, the final capture state object will indicate that the frame is unavailable. It is important to either check the capture status to avoid querying for an unavailable frame or handle unavailable frames appropriately.
Android
Capture State’s Images¶
mCurrentCaptureSessionFrame = mCurrentCaptureState.getFrame();
Get the Capture State’s Feedback
When the capture session’s state is capturing, the SDK will provide feedback to the application. The feedback relates to the subject’s position of the face relative to the ideal location and lighting.
Android
Capture State’s Feedback¶
mCurrentCaptureSessionFrame = mCurrentCaptureState.getFeedback();
Get the Server Package
Once a capture has successfully completed, the workflow used to start the capture session can be used to get an encrypted or non-encrypted package. A package type is necessary to tell the server how to analyze the package. There are several package types that can be used based on usability and security requirements.
An encryption type and corresponding public key is necessary to create the encrypted package. The public key is retrieved from the AwareID server.
Unencrypted
Android
Get the Server Package¶
mCurrentCaptureServerPackage = mFaceCapture.getServerPackage(mWorkFlow, mPackageType);
Encrypted
Android
Get the Encrypted Server Package¶
mCurrentCaptureServerPackage = mFaceCapture.getEncryptedServerPackage(mEncryptionType, mPublicKey, mWorkFlow, mPackageType);
Stop a Capture Session
A stop capture session function is available for when the application needs to end a capture session early. The capture session should be stopped when the application is put into the background to avoid conflicts with other applications that may be running.
Android
Stop a Capture Session¶
mFaceCapture.stopCaptureSession();
Capture Document
Overview
Document Reader is used to scan documents such as passports for subject data and facial images.
- Details for the Regula Document Reader API can be found on their website at:https://docs.regulaforensics.com/develop/doc-reader-sdk/.
- Regula’s Android QuickStart guide is available here: https://docs.regulaforensics.com/develop/doc-reader-sdk/mobile/android/quickstart/
Document Capture Integration
There are two types of document captures, OCR and NFC. Each capture type consists of setup, running and processing. A “DocumentReader” must first be initialized, and a database file downloaded. This database consists of document templates to assist in document recognition. Each capture has a list of available setup options to help with the capture process. Once the capture process is started the user will be prompted by UI and text instructions on how to position the document for capture. When a capture is finished the collected data can be sent to the AwareID server for analysis.
Document Capture Initialization
Document capture initialization consists of checking for a valid license and downloading the document database.
Prepare The Database
The database file will be downloaded from the network only one time and stored on the user device. The current database size is (~60MB), the size can be controlled by replacing the string “Full” with other options found in the documentation: https://docs.regulaforensics.com/develop/doc-reader-sdk/mobile/android/database/
Android
Prepare The Database¶
DocumentReader.Instance().prepareDatabase(getApplicationContext(), "Full", // if you use 7310, replace to FullAuth new IDocumentReaderPrepareCompletion() { @Override public void onPrepareProgressChanged(int progress) { // Database download progress. } @Override public void onPrepareCompleted(boolean status, DocumentReaderException error) { if (status) { initializeReader(); } });
InitializeReader
After downloading the database, the developer can initialize the reader. Read the license file from appsrcmainresrawdocument.license into a buffer. The SDK will automatically check for license updates if the update license option is set to true. Initializing the reader will result in a completion callback, and then the scan can be started.
Android
Initialize the Reader¶
DocReaderConfig config = new DocReaderConfig(license); config.setLicenseUpdate(true); //The SDK will check for license updates online. //Initializing the reader DocumentReader.Instance().initializeReader(getApplicationContext(), config, initCompletion);
Setup Initialization Completion Callback
A completion handler callback is required to be set to the IDocumentReaderInitCompletion. It will be called after the initialization process is complete, either successfully or with errors. The initCompletion callback takes two parameters. The first one is a result boolean. The second one is a DocumentReaderException type object which contains an error message if applicable.
Android
Setup Init Completion Callback¶
protected final IDocumentReaderInitCompletion initCompletion = (result, error) -> { //Setup OCR scanning. };
Document Scanning Process For OCR
Setup Document Scanning
Set the selected scenario and any required options. The SDK supports many scenarios and options, one such option is the ability to check for holograms on a document, another option is the ability to scan multiple pages of a document. More information on scenarios and options can be found in the documentation.
Android
Setup Document Scanning¶
// Set the selected scenario to DocumentReader params. DocumentReader.Instance().processParams().scenario = Scenario.SCENARIO_FULL_PROCESS; DocumentReader.Instance().startNewSession(); // Set selected options. DocumentReader.Instance().processParams().checkHologram = false; DocumentReader.Instance().processParams().multipageProcessing = true; DocumentReader.Instance().functionality().edit().setOrientation(DocReaderOrientation.PORTRAIT).apply();
Start Document Scanning
Starting the scanner requires passing in a completion callback where results can be processed.
Android
Start Document Scanning¶
// Start the scanner, passing a callback function. DocumentReader.Instance().showScanner(getApplicationContext(), ocrCompletion);
Process Data
Once scanning is complete save the encrypted data by calling results.getEncryptedContainers().
Android
Process Data¶
//Setup a completion callback. private final IDocumentReaderCompletion ocrCompletion = new IDocumentReaderCompletion() { @Override public void onCompleted(int action, DocumentReaderResults results, DocumentReaderException error) { // Processing is finished, all results are ready. if ((action == DocReaderAction.COMPLETE) { // Check if the document has a chip. mChipUsable = results.chipPage; // Save the encrypted data. mEncryptedPackageOcr = results.getEncryptedContainers(); } } };
Document Scanning Process for NFC (Optional)
Setup Document Scanning
This process is optional depending on if the server is set to capture RFID data and the document is equipped with an RFID chip. For active authentication, which is supported by some passports, a server URL must be supplied to handle a server challenge.
Android
Setup Document Scanning¶
// Set selected options. DocumentReader.Instance().functionality().edit().setOrientation(DocReaderOrientation.PORTRAIT).apply(); // Setup for Active Authentication. DocumentReader.Instance().processParams().shouldReturnPackageForReprocess = true; ReprocParams reprocParams = new ReprocParams("https://awareid-dev.aware-apis.com/regula-docreader"); reprocParams.setFailIfNoService(true); // Please see the Enrollment Process chapter for access_token and apikey. Map<String, String> headers = new HashMap<>(); headers.put("Authorization", "Bearer " + access_token); headers.put("apikey", mApiKey); reprocParams.setHttpHeaders(headers); DocumentReader.Instance().rfidScenario().setReprocessParams(reprocParams);
Start Document Scanning
Starting the scanner requires passing in a completion callback where results can be processed.
Android
Start Document Scanning¶
// Start the scanner, passing a callback function. DocumentReader.Instance().startRFIDReader(getApplicationContext(), nfcReaderCompletion);
Process Data
Once scanning is complete save the encrypted data by calling results.getEncryptedContainers().
Android
Process Data¶
//Setup a completion callback. private final IDocumentReaderCompletion nfcReaderCompletion = new IDocumentReaderCompletion() { @Override public void onCompleted(int rfidAction, DocumentReaderResults results, DocumentReaderException error) { if (rfidAction == DocReaderAction.COMPLETE) { // Save the encrypted data. mEncryptedPackageOcr = results.getEncryptedContainers(); } } };
Notes
Processing the callback data should be done in the OnResume() of the applications activity. This will make sure that the application owns the data and that the activity used by the Regula SDK if finished.
Enrollment Process
This section provides details regarding the enrollment process when initiated from a client or QR code. An instance of the services is hosted by Aware at www.awareid.aware-apis.com.
Enrollment with AwareID requires both a face capture and a document capture. The face from the document is matched against the face capture from the application to ensure that the user is owner of the document.
Enrollment can be done in one of two ways.
Client Based
Get Access Token
Retrieve an “access_token”, this token allows communication between the client application and the AwareID servers. For this enrollment method the user is required to enter some configuration information:
Configuration Variables¶
mUserName - A name used to identify the enrollment. mEmail - An email used to identify the enrollment. mPhoneNumber - A phone number used to identify the enrollment. mCustomerName - The customer’s name to access the AwareID server. mHostname - The URL of the AwareID server ex. https://awareid.aware-apis.com/mCustomerName mApiKey - Used to access the AwareID server. mClientSecret - Used to access the AwareID server.
Get Access Token¶
POST /auth/realms/{{customer_name}}-consumers/protocol/openid-connect/token Content-Type: 'application/x-www-form-urlencoded', "client_id": client_id "client_secret": client_secret "scope": openid "grant_type" : client_credentials
Urlencoded¶
This is the only call whose content type of this call is “application/x-www-form-urlencoded”
Response - Retrieve Access Token
The “access_token” is saved and used as the “JWT” in future calls to the AwareID server.
Response - openid-connect¶
STATUS CODE 200 { "access_token": "eyJhbGciOiJSUzI1NiIsI...", "expires_in": 300, "refresh_expires_in": 0, "token_type": "Bearer", "id_token": "eyJhbGciOiJSUzI1NiI...", "not-before-policy": 0, "scope": "openid" }
QR Code Based
Generate QR Code
Web Portal
To start an enrollment using the QR code method a QR code must first be generated to be consumed by the client application (in our example we use a web app). This web application uses a UI to allow an end-user to register using a username and email address. Then uses these pieces of information in the API Call for /triggerEnroll.
Trigger Enroll
Enrollment is initiated by calling the /triggerEnroll endpoint with the received access token.
- username - required
- email - required
- notifyOptions - optional
Trigger Enroll¶
POST baseUrl + /b2c/proxy/triggerEnroll Content-Type: 'application/json; charset=UTF-8', { "username": "[email protected]", "email": "[email protected]", "notifyOptions": { "notifyByEmail": false } }
Response - Trigger Enroll¶
STATUS CODE 200 { status : "SUCCESS" sessionCallbackURL : "https://awareid-dev.aware-apis.com/onboarding?data=jgTW40dmoG6Hp_d6Rg7YaZ97vfGSlV5BcBJvLvqXVmhoQ2Hg2DcC2Kvr9AkTZ38ZkyIfiSj80QFxOWs1YeckYsp3D0D9vS46wppl1Zdt-tpiAdzlvBKA2DBfcj7rf0VePWUn1vKdIPgEoWAulqRxZ_mNakFB7FijLg0QJ8kYsB6w0Nk1A4m9QtLGIdHcuGn9XJnxooQHyr2yhtUsgfOo2FrRXYmFIF7ZNwxYd56miFCs-yuD6eZZcvZ1M01Wje7ji0NYUWVpdes-DA_P0cKgsLPX5sV7SyPSlf9kmoCQz7Ag20kAKkOf-LFFKQmgnJ3362nXIEovxS8vp4BCClu7vIfEVCE2s1zS7zNwrDuRfFdViVAQMMxDMe77LnbKbfvLqUhiv--wPFyV9Iier1EDSL9y5kikOw_PGSyuRzvbQKuoNdGj-IqVZYZ_5QivOFqq_OEt8jaX1zZxAiQ8uXRt3g" qrcodeImage : "iVBORw0KGgoAAAA..." sessionToken : "aa73e547-0f1b-4235-a7b0-dd52fa4ab774" errorSummary : null }
Our response for trigger enroll includes five pieces of information with the most relevant piece being the base64 encoded string of the QR that is used to be displayed to the user to continue the enrollment on their device.
Decrypt The QR Code
The QR Code will return a URL with an encrypted data parameter named “data”.
This data must be decrypted using the available public key. Once decoded three pieces of information are provided separated by “&”.
- Host URL
- This URL is where all subsequent api calls will be made through.
- The API Key
- This API Key is used in the header of api calls.
- The key value pair in the header is as follows:
“apikey”:API_Key
- Session Token
- The session token is used to validate the session.
Decode The base64 URL Encoded Data
Android
Decode The base64 URL Encoded Data¶
byte[] base64DecodedData = Base64.decode(encryptedData, Base64.DEFAULT | Base64.URL_SAFE | Base64.NO_PADDING); Log.i(TAG, "Base64 decoded");
Extract Signature and Encrypted Data
Android
Extract Signature And Encrypted Data¶
byte[] signatureExtracted = new byte[256]; byte[] encryptedDataExtracted = new byte[base64DecodedData.length - 256]; System.arraycopy(base64DecodedData, 0, signatureExtracted, 0, signatureExtracted.length); // Get signature from data. Log.i(TAG, "Signature extracted"); System.arraycopy(base64DecodedData, 256, encryptedDataExtracted, 0, base64DecodedData.length - 256); Log.i(TAG, "Encrypted Data extracted");
Verify Signature
Verify the signature using the public key.
Server Key¶
String serverPublicKeyEncoded = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj1v8H6ehFSCfm23Z12W5tWr9UQM8+kWJsZqplgE7QcuhbM97G1bs874ouKjojdWmFHuLSkEuUNi9oIU3USJhSaCUmseD7CI0Tui4ODy8Y/3++BNqYGXAG2XQhNuGx4/6JVCg33zL46yl7zAj5fdl5+tJ5DrITDqf12dcwdPNTOM18ddBkKRL0oD4eIx2IGc4oCEBPghJlQCmDAuuXsuaNQc12sOo2BC9Uf+TQgIe5OjptAEaZLIEYTKle66yrWlZ+o0T028DtK971UUMmBQ0Uk+JKKfvTMkgCam4lZ8UMmBeaogYF5UPcMsoQlfkqjo3RILEyCaeW97ZAw3oq70DjwIDAQAB";
Android
Verify Signature¶
byte[] decodedPublicKey = Base64.decode(serverPublicKeyEncoded, Base64.DEFAULT); Log.i(TAG, "Public key decoded"); X509EncodedKeySpec spec = new X509EncodedKeySpec(decodedPublicKey); KeyFactory kf = null; kf = KeyFactory.getInstance("RSA"); PublicKey publicKey = null; publicKey = kf.generatePublic(spec); boolean verifyResult = CryptoUtils.verifyUsingPublicKey("SHA256WithRSA", publicKey, encryptedDataExtracted, signatureExtracted);
Rebuild Key Using SecretKeySpec
Android
Rebuild Key Using SecretKeySpec¶
byte[] decodedKey = Base64.decode(serverKey, Base64.DEFAULT); Log.i(TAG, "Secret key decoded"); SecretKey serverSecret = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES"); Log.i(TAG, serverSecret.toString()); String decryptedData = null; decryptedData = CryptoUtils.dataDecrypt(encryptedDataExtracted, serverSecret); String[] valueElements = decryptedData.split("&"); prefsEdit.putString(AppConstants.BIMAAS_URL_KEY, "https://" + valueElements[0]).apply(); prefsEdit.putString(AppConstants.API_KEY_KEY, valueElements[1]).apply(); prefsEdit.putString(AppConstants.SESSION_TOKEN, valueElements[2]).apply();
The following steps are the same for both client based and QR code based enrollment
Initiate An Enrollment
With this method type we start onboarding with accessToken, sessionToken and apikey.
Initiate An Enrollment¶
POST /onboarding/enrollment/enroll Authorization: 'Bearer AccessToken' apikey: 'apikey' { "sessionToken": "sessiontoken" }
Response - Initiate an Enrollment
Response - Initiate An Enrollment¶
STATUS CODE 200 { "enrollmentToken": "be00a983-e60a-44de-8685-70da3b1b98be", "userExistsAlready": false, "requiredChecks": [ "addDevice", "addFace", "addDocument" ] }
Get Device ID
Android
Get Device Id¶
deviceId = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
Add Device
The device ID is checked when performing an authentication to confirm the device enrolled is the same as the device attempting.
Add device¶
POST /onboarding/enrollment/adddevice Authorization: 'Bearer AccessToken' apikey: 'apikey' { "enrollmentToken": "enrollmentToken", "deviceId": "deviceID" }
Response - Add Device
Response - Add Device¶
{ "enrollmentStatus": 1, "registrationCode": "" }
From here the response will include a registration code and enrollment status.
There are 3 enrollment statuses:
Enrollment Statuses¶
0 = Enrollment Failed 1 = Enrollment Pending 2 = Enrollment Complete
Add Face Sample
Send a facial image to the back end to verify liveness. If the subject is live, the facial image will be kept for verification. The addFace API call requires the JSON package generated by the Face Capture SDK.
Add Face Sample¶
POST /onboarding/enrollment/addFace Authorization: 'Bearer AccessToken' apikey: 'apikey' { "enrollmentToken": "enrollmentToken", "faceLivenessData": { "video": { "workflow_data": { "workflow": "hotel2", "rotation": 0, "frames": [ "data":"face package data generated by face sdk", "data":"face package data generated by face sdk", "data":"face package data generated by face sdk" ] }, "meta_data": { "client_device_brand": "Unknown", "username": "username", "client_version": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66" }, "client_version": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66" } } }
Response - Add Face Sample
The response from the enrollment call returns:
- Liveness Result
- This is a boolean value.
- returns true if the sample is assessed to be a live sample
- returns false is the sample is assessed too not be live
- Enrollment Status
- 0 = failed
- 1 = pending
- 2 = success
- Registration Code
- This code is used in the re-enrollment process
- Liveness Result
- Broken down into several fields giving feedback on the liveness score.
Liveness Result¶
STATUS CODE 200 { "livenessResult": true, "enrollmentStatus": 1, "registrationCode": "LLXL2N", "faceLivenessResults": { "video": { "liveness_result": { "decision": "LIVE", "feedback": [], "score_frr": 1.1757098732441127 } } } }
Add Document OCR
This method takes the data captured from the document capture SDK.
Add Document OCR¶
POST /onboarding/enrollment/addDcoumentOCR Authorization: 'Bearer AccessToken' apikey: 'apikey' { "documentsInfo": { "documentPayload": { "request": { "data": { "ContainerList": { "List": [{ "License": "AAEAAHQU5U8HN..." "buf_length": 1724, "light": 0, "list_idx": 0, "page_idx": 0, "result_type": 50 }, { "EncryptedRCL": "MDAwMXjaJJdlUyv..." "buf_length": 1063742, "light": 0, "list_idx": 0, "page_idx": 0, "result_type": 49 }] }, "TransactionInfo": { "ComputerName": "localhost", "DateTime": "2023-06-29T12:03:04.472Z", "SystemInfo": "Linux, localhost, 5.10.81-android12-9-24339823-abS901U1UEU2AVF7, #1 SMP PREEMPT Tue Jun 21 00:33:42 UTC 2022, aarch64", "TransactionID": "903639b3-dad8-4cdb-9c14-cc25ab624019", "UserName": "u0_a952", "Version": "6.8.9145" } }, "vendor": "REGULA" } }, "processParam": { "alreadyCropped": true } }, "enrollmentToken": "64e401db-a6f0-4484-9930-c948abeaaf09" }
Response - Add Document OCR
Response - Add Document OCR¶
STATUS CODE 200 { "enrollmentStatus": 0, "registrationCode": "", "matchResult": true, "matchScore": 5.8946095, "ocrResults": { "mrzPresence": false, "documentType": "United States - ePassport (2005) Page 3", "year": "2005", "documentTypeId": "-705504038", "fidType": "Passport Page", "overallResult": "FAILED", "rfidValidationResults": null, "authenticityResult": { "authenticityImagePatternCheck": { "securityElements": [], "overallResult": "UNDEFINED" }, "overallResult": "UNDEFINED" }, "overallResultScore": 0, "icaoCode": "USA", "fidTypeId": "240", "signatureImage": "/9j/4AAQS..." "overallResultInfo": { "fieldErrorCodes": ["MRZ_NONE", "VISUAL_NONE", "BARCODE_NONE", "DOCUMENT EXPIRED"], "numberOfImages": 2, "imagePairValid": false, "analysisEngineErrorCodes": ["AUTHENTICITY_NULL"] }, "countryName": "United States", "portraitImage": "/9j/4AAQSkZJRgAB..." "rfidPresence": 1, "fieldType": [{ "name": "Document Class Code", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 0, "overallResult": "UNDEFINED" }, { "name": "Issuing State Code", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 1, "overallResult": "UNDEFINED" }, { "name": "Document #", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 2, "overallResult": "UNDEFINED" }, { "name": "Date of expiry", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 3, "overallResult": "UNDEFINED" }, { "name": "Date of issue", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 4, "overallResult": "UNDEFINED" }, { "name": "Date of birth", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 5, "overallResult": "UNDEFINED" }, { "name": "Place of Birth", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 6, "overallResult": "UNDEFINED" }, { "name": "Surname", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 8, "overallResult": "UNDEFINED" }, { "name": "Given names", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 9, "overallResult": "UNDEFINED" }, { "name": "Nationality", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 11, "overallResult": "UNDEFINED" }, { "name": "Sex", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 12, "overallResult": "UNDEFINED" }, { "name": "Issuing Authority", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 24, "overallResult": "UNDEFINED" }, { "name": "Surname And Given Names", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 25, "overallResult": "UNDEFINED" }, { "name": "Nationality Code", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 26, "overallResult": "UNDEFINED" }, { "name": "MRZ Type", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 35, "overallResult": "UNDEFINED" }, { "name": "Optional data", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 36, "overallResult": "UNDEFINED" }, { "name": "Issuing State", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 38, "overallResult": "UNDEFINED" }, { "name": "MRZ Lines", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 51, "overallResult": "UNDEFINED" }, { "name": "Check digit of document number", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 80, "overallResult": "UNDEFINED" }, { "name": "Check digit of birth date ", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 81, "overallResult": "UNDEFINED" }, { "name": "Check digit of expiry date", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 82, "overallResult": "UNDEFINED" }, { "name": "Final check digit", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 84, "overallResult": "UNDEFINED" }, { "name": "Age", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 185, "overallResult": "UNDEFINED" }, { "name": "Check digit of 'Optional data'", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 195, "overallResult": "UNDEFINED" }, { "name": "Other valid IDs", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 315, "overallResult": "UNDEFINED" }, { "name": "Observations", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 318, "overallResult": "UNDEFINED" }, { "name": "DS Certificate Issuer", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 327, "overallResult": "UNDEFINED" }, { "name": "Months to expire", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 364, "overallResult": "UNDEFINED" }, { "name": "Age at issue", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 522, "overallResult": "UNDEFINED" }, { "name": "Years since issue", "fieldResult": { "isMrzStatusValid": "NOT_VALIDATED", "isBarcodeStatusValid": "NOT_VALIDATED", "mrz": "", "mrzVisualCompareValid": "NOT_COMPARED", "isVisualStatusValid": "NOT_VALIDATED", "visual": "", "barcode": "", "mrzBarcodeCompareValid": "NOT_COMPARED", "visualBarcodeCompareValid": "NOT_COMPARED" }, "typeId": 523, "overallResult": "UNDEFINED" }], "icaoVerificationResult": false }, "retryDocumentCapture": false, "documentVerificationResult": false, "icaoVerificationResult": false, "icaoChipValidationResults": null }
Software Acknowledgments
AwareID Document Capture libraries incorporate third-party software. See the LICENSE file installed with the AwareID Document Capture software for the full license agreement.