Se ha implementado la funcionalidad de detección de cambios biométricos que devuelve un error si existen discrepancias y que impide realizar el login en caso de que activemos el secureFlag.
-
Inicialización
Al inicial la app se le pasan los parámetros indicados:
BioApplication.initBioLibrary(isClientLib, licenseKey, secureFlag)-
Enrollment
Se realiza un snapshot de la actual situación biométrica del dispositivo generando una clave en el keystore vinculada a la autenticación de biometría del SO (junto a un timestamp en milisegundos en sharedPreferences). Dicha foto se hace al finalizar el proceso de enrollment:
Para hacer el snapshot en KOTLIN llamamos a snapshotBiometricAdditions:
override fun doAfterValidationFinished() {
Toast.makeText(this, "Successful validating", Toast.LENGTH_SHORT).show()
BiometricUtils.snapshotBiometricAdditions(bioSharedPreferences)
}
-
Login
Para hacer un login y recoger los datos del usuario hacemos una llamada a userInfoWithLogin del PublicDataSource. Internamente nos validará cambios biométricos.
private fun login() {
PublicDataSource(BioSharedPreferences(this)).userInfoWithLogin(
activity = this,
resultLauncherLogin = resultLauncherLogin,
onSuccess = { userInfoBack -> onSuccess(userInfoBack) },
onError = { exception -> onError(exception)
})
}
-
Login or create
Iniciar la app y hacer una llamada al método loginOrCreatedel publicDataSource. Nos comprobará internamente si existe usuario para redirigir al enrollment (si no existe) o hacer un login (si existe) y verificando la existencia de cambios biométricos.
private fun loginOrCreate() {
publicDataSource.loginOrCreate(
activity = this,
resultLauncherLogin = resultLauncherLogin,
launchEnrollment = { startEnrollment() },
onLoginSuccess = { goToDashboard() },
onError = { exception -> showError(exception) }
)
}
SecureFlag = TRUE
Si existen cambios biométricos nos escupe una excepción e impide continuar con el flujo normal tanto de login como de scanQR. El integrador es el encargado de contemplar el flujo deseado al capturarlo y, por ejemplo, ofrecer al usuario redirigirlo al enrollment para validar de nuevo al usuario.
SecureFlag = FALSE
Si existen cambios biométricos nos escupe una excepción pero continúa con el flujo normal de login o scanQR. Cada vez que realicemos este proceso escupe la excepción porque no se actualiza el estado biométrico.
Una vez modificadas las huellas ya será SIEMPRE distinto al snapshot realizado al finalizar el proceso de enrollment y SIEMPRE devolverá la excepción (aunque continúe con el login).
-
LOGIN
Podemos capturar esa excepción y tratarla en onError = { exception -> showError(exception) }:
PublicDataSource(bioSharedPreferences).userInfoWithLogin(
activity = this,
resultLauncherLogin = resultLauncherLogin,
onSuccess = { userInfoBack -> onSuccess(userInfoBack) },
onError = { exception -> onError(exception)
})
private fun showError(error: BioException) {
if(error.error is Error.FingerprintChanged && MyApp.getBiometricSecurityFlag(this)) {
// There are biometric changes AND security flag is TRUE
} else if(error.error is Error.FingerprintChanged) {
// There are biometric changes BUT without security flag, only notify to user and continue with flow
} else {
// Other errors
}
}
-
ScanQR
ConfigFile.startBioScan(context, resultBarCodeLauncher)
resultBarCodeLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()) { result ->
when(result.resultCode) {
RESULT_OK -> {
// Scan completed sucessfuly
}
RESULT_CANCELED -> {
result.data?.extras?.let {
val bioException = it.get(Constants.ERROR) as BioException
// Scan NOT COMPLETED
}
}
Constants.RESULT_OK_WITH_BIOMETRIC_CHANGES -> {
// There are biometric changes AND security flag is FALSE
result.data?.extras?.let {
val bioException = it.get(Constants.ERROR) as BioException
// Scan completed sucessfuly with biometric error
}
}
}
}