Xác thực vân tay trong android

Hiện nay, việc xác thực bằng vân tay đã trở nên phổ biến khi việc thanh toán online đã quá quen thuộc với chúng ta.

Bài viết hôm nay mình cũng muốn hướng đến chủ đề này, làm cách nào để chúng ta có thể triển khai việc xác thực bằng vân tay trong Android, chỉ 4 bước cơ bản, chúng ta cùng bắt đầu nhé!

Bước 1: Thêm những quyền cho phép vào AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.an.biometric">

<!-- Step 1: Add the following permission to the app  -->
<uses-permission android:name="android.permission.USE_BIOMETRIC" />

<!-- Step 2: This permission is depreciated in Android P  -->
<uses-permission android:name="android.permission.USE_FINGERPRINT" />

</manifest>

Bước 2: Kiểm tra nếu thiết bị hỗ trợ xác thực sinh trắc học(Biometric authentication)

Chúng ta sẽ kiểm tra các điều kiện :

  • Thiết bị đang chạy Android 6.0 trở lên
  • Thiết bị có cảm biến vân tay
  • Người dùng đã cấp cho ứng dụng của bạn quyền truy cập vào cảm biến vân tay.
  • Người dùng đã đăng ký ít nhất một dấu vân tay trên thiết bị của họ.

Chúng ta có thể tạo một lớp Util để kiểm tra các điều kiện trên:

public class BiometricUtils {


    public static boolean isBiometricPromptEnabled() {
        return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P);
    }


    /*
     * Condition I: Check if the android version in device is greater than
     * Marshmallow, since fingerprint authentication is only supported
     * from Android 6.0.
     * Note: If your project's minSdkversion is 23 or higher,
     * then you won't need to perform this check.
     *
     * */
    public static boolean isSdkVersionSupported() {
        return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M);
    }



    /*
     * Condition II: Check if the device has fingerprint sensors.
     * Note: If you marked android.hardware.fingerprint as something that
     * your app requires (android:required="true"), then you don't need
     * to perform this check.
     * 
     * */
    public static boolean isHardwareSupported(Context context) {
        FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(context);
        return fingerprintManager.isHardwareDetected();
    }



    /*
     * Condition III: Fingerprint authentication can be matched with a 
     * registered fingerprint of the user. So we need to perform this check
     * in order to enable fingerprint authentication
     * 
     * */
    public static boolean isFingerprintAvailable(Context context) {
        FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(context);
        return fingerprintManager.hasEnrolledFingerprints();
    }



    /*
     * Condition IV: Check if the permission has been added to
     * the app. This permission will be granted as soon as the user
     * installs the app on their device.
     * 
     * */    
    public static boolean isPermissionGranted(Context context) {
        return ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) ==
                PackageManager.PERMISSION_GRANTED;
    }
}

Bước 3: Hiển thị BiometricPrompt dialog

Khi các điều kiện ở bước 2 đã được kiểm tra hoàn tất, chúng ta có thể kiểm tra phiên bản Android trong thiết bị có phải là Android P không ? vì BIometricPrompt dialog chỉ được hỗ trợ trong Android P

@TargetApi(Build.VERSION_CODES.P)
private void displayBiometricPrompt(final BiometricCallback biometricCallback) {
    new BiometricPrompt.Builder(context)
        .setTitle(title)
        .setSubtitle(subtitle)
        .setDescription(description)
        .setNegativeButton(negativeButtonText, context.getMainExecutor(), new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                biometricCallback.onAuthenticationCancelled();
            }
        })
        .build();
}

Sử dụng BiometricPrompt Builder, chúng ta có thể:

  • setTitle () - Đặt tiêu đề để hiển thị (Bắt buộc)
  • setSubtitle () - Đặt phụ đề để hiển thị (Tùy chọn)
  • setDes mô tả () - Đặt mô tả để hiển thị (Tùy chọn)
  • setNegativeButton () - Đặt văn bản cho nút phủ định (Bắt buộc). Bạn cũng phải cung cấp một phiên bản Executor và một trình nghe nhấp cho nút phủ định. Lưu ý: Bạn có thể tùy chỉnh biểu tượng hoặc thông báo lỗi được sử dụng trong dialog.

Bước 4: Xử lý việc xác thực qua các hàm callback

Tiếp theo, chúng ta sử dụng BiometricPrompt.AuthenticationCallback để lắng nghe các sự kiện xác thực từ người dùng. Nó bao gồm 4 phương thức:

onAuthenticationSceeded

Hàm này sẽ được chạy vào khi dấu vân tay đã được khớp thành công với một trong những dấu vân tay đã đăng ký trên thiết bị, từ đó đối tượng sẽ được xác thực

onAuthenticationFails

Hàm này sẽ được chạy vào khi vân tay không khớp với bất kỳ dấu vân tay nào được đăng ký trên thiết bị, thì cuộc gọi lại này sẽ được kích hoạt.

onAuthenticationError

Hàm này sẽ được chạy vào khi gặp phải một lỗi không thể phục hồi và quá trình xác thực đã hoàn thành mà không thành công. Hàm được cung cấp một mã lỗi để xác định nguyên nhân lỗi, cùng với thông báo lỗi. Các loại mã lỗi khác nhau có thể xảy ra là:

  • BIOMETRIC_ERROR_LOCKOUT HỌ Hoạt động đã bị hủy vì API bị khóa do quá nhiều lần thử.
  • BIOMETRIC_ERROR_LOCKOUT_PERMANENT - Thao tác đã bị hủy vì BIOMETRIC_ERROR_LOCKOUT xảy ra quá nhiều lần.
  • BIOMETRIC_ERROR_NOClickACE - Không thể hoàn tất thao tác vì không còn đủ dung lượng để hoàn thành thao tác.
  • BIOMETRIC_ERROR_TIMEOUT - Hết giờ xảy ra do yêu cầu hiện tại đã chạy quá lâu.
  • BIOMETRIC_ERROR_UNABLE_TO_PROCESS - Cảm biến không thể xử lý hình ảnh hiện tại.
  • BIOMETRIC_ERROR_USER_CANCELED - Người dùng đã hủy thao tác.
  • BIOMETRIC_ERROR_VENDOR - Nếu có những điều kiện không thuộc một trong các loại trên.
  • BIOMETRIC_ERROR_NO_BIOMETRICS - Người dùng không có bất kỳ sinh trắc học nào được đăng ký trong thiết bị.
  • BIOMETRIC_ERROR_CANCELED - Thao tác đã bị hủy vì cảm biến sinh trắc học không khả dụng.
  • BIOMETRIC_ERROR_HW_NOT_PRESENT - Thiết bị không có cảm biến sinh trắc học.
  • BIOMETRIC_ERROR_HW_UNAVAILABLE - Phần cứng thiết bị không khả dụng.

onAuthenticationHelp

Hàm này được gọi khi xảy ra lỗi không nghiêm trọng trong quá trình xác thực. Callback sẽ được cung cấp một mã trợ giúp để xác định nguyên nhân lỗi, cùng với thông báo trợ giúp. Các loại mã trợ giúp khác nhau có thể xảy ra là:

  • BIOMETRIC_ACQUIRED_IMAGER_DIRTY - Hình ảnh sinh trắc học quá nhiễu do nghi ngờ bụi bẩn trên cảm biến.
  • BIOMETRIC_ACQUIRED_INSUFFICIENT - Hình ảnh sinh trắc học quá ồn để xử lý. Điều này có thể là do nhiều lý do nhưng nhìn chung điều này là do hình ảnh không thể đọc được.
  • BIOMETRIC_ACQUIRED_PARTIAL - Chỉ một hình ảnh sinh trắc học được phát hiện.
  • BIOMETRIC_ACQUIRED_TOO_FAST - Hình ảnh sinh trắc học không đầy đủ vì người dùng di chuyển ngón tay quanh cảm biến quá nhanh.
  • BIOMETRIC_ACQUIRED_TOO_SLOW - Không thể đọc được hình ảnh sinh trắc học do thiếu chuyển động từ người dùng xung quanh cảm biến.
@RequiresApi(api = Build.VERSION_CODES.P)
public class BiometricCallbackV28 extends BiometricPrompt.AuthenticationCallback {

    private BiometricCallback biometricCallback;
    public BiometricCallbackV28(BiometricCallback biometricCallback) {
        this.biometricCallback = biometricCallback;
    }


    @Override
    public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
        super.onAuthenticationSucceeded(result);
        biometricCallback.onAuthenticationSuccessful();
    }


    @Override
    public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
        super.onAuthenticationHelp(helpCode, helpString);
        biometricCallback.onAuthenticationHelp(helpCode, helpString);
    }


    @Override
    public void onAuthenticationError(int errorCode, CharSequence errString) {
        super.onAuthenticationError(errorCode, errString);
        biometricCallback.onAuthenticationError(errorCode, errString);
    }


    @Override
    public void onAuthenticationFailed() {
        super.onAuthenticationFailed();
        biometricCallback.onAuthenticationFailed();
    }
}

Kết luận

Như vậy với 4 bước cơ bản, chúng ta có thể triển khai việc xác thực đăng nhập bằng vân tay vào trong project của mình

Tài liệu tham khảo

https://proandroiddev.com/5-steps-to-implement-biometric-authentication-in-android-dbeb825aeee8