הצגת תיבת דו-שיח לאימות ביומטרי

אחת מהשיטות להגנה על מידע רגיש או תוכן פרימיום באפליקציה היא לבקש אימות ביומטרי, כמו שימוש בזיהוי פנים או בזיהוי טביעת אצבע. במדריך הזה מוסבר איך לתמוך בתהליכי כניסה ביומטריים באפליקציה.

ככלל, צריך להשתמש במנהל פרטי הכניסה לצורך כניסה ראשונית מכשיר. לאחר מכן אפשר לבצע את ההרשאות מחדש באמצעות אחת מההנחיות הביומטריות, או 'מנהל פרטי הכניסה'. היתרון של השימוש ב-Biometric Prompt הוא שיש בו יותר אפשרויות להתאמה אישית, בעוד ש-Credential Manager מציע הטמעה אחת בשני התהליכים.

להצהיר על סוגי האימות שהאפליקציה שלך תומכת בהם

כדי להגדיר את סוגי האימות שהאפליקציה תומכת בהם, צריך להשתמש ב BiometricManager.Authenticators גרפי. המערכת מאפשרת לכם להצהיר על הסוגים הבאים של אימות:

BIOMETRIC_STRONG
אימות באמצעות ביומטריה ברמה 3, כפי שמוגדר בדף תאימות ל-Android הגדרה
BIOMETRIC_WEAK
אימות באמצעות ביומטריה ברמה 2, כפי שמוגדר ב תאימות ל-Android הגדרה
DEVICE_CREDENTIAL
אימות באמצעות פרטי כניסה של נעילת מסך – קוד האימות, קו ביטול הנעילה או הסיסמה של המשתמש.

כדי להתחיל להשתמש בכלי אימות, המשתמש צריך ליצור קוד אימות. קו ביטול נעילה או סיסמה. אם למשתמש אין עדיין מזהה, המידע הביומטרי בתהליך ההרשמה, תתבקשו ליצור חשבון.

כדי להגדיר את סוגי האימות הביומטרי שהאפליקציה תקבל, מעבירים את סוג האימות או שילוב של סוגי אימות בביטים לשיטה setAllowedAuthenticators(). קטע הקוד הבא מראה איך לתמוך באימות באמצעות פרטי כניסה ביומטריים ברמה 3 או פרטי כניסה לנעילת מסך.

Kotlin

// Lets the user authenticate using either a Class 3 biometric or
// their lock screen credential (PIN, pattern, or password).
promptInfo = BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setAllowedAuthenticators(BIOMETRIC_STRONG or DEVICE_CREDENTIAL)
        .build()

Java

// Lets user authenticate using either a Class 3 biometric or
// their lock screen credential (PIN, pattern, or password).
promptInfo = new BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setAllowedAuthenticators(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)
        .build();

השילובים הבאים של סוגי מאמתים לא נתמכים ב-Android 10 (API ברמה 29) וגרסאות קודמות: DEVICE_CREDENTIAL ו-BIOMETRIC_STRONG | DEVICE_CREDENTIAL. כדי לבדוק אם יש קוד אימות: או סיסמה ב-Android מגרסה 10 ומטה, משתמשים KeyguardManager.isDeviceSecure() .

איך לבדוק שיש אפשרות של אימות ביומטרי

אחרי שמחליטים באילו רכיבי אימות האפליקציה תומכת, בודקים אם האלמנטים האלה זמינים. כדי לעשות את זה, מעבירים את אותו שילוב סיביות של סוגים שהצהרתם עליו באמצעות setAllowedAuthenticators() בתוך canAuthenticate(). במקרה הצורך, מפעילים את ACTION_BIOMETRIC_ENROLL Intent פעולה. ב-intent extra, מציינים את קבוצת מאמתי החשבונות שהאפליקציה מקבלת. ההגדרה הזו גורמת למשתמש לרשום פרטי כניסה של לאימות שהאפליקציה שלך מקבלת.

Kotlin

val biometricManager = BiometricManager.from(this)
when (biometricManager.canAuthenticate(BIOMETRIC_STRONG or DEVICE_CREDENTIAL)) {
    BiometricManager.BIOMETRIC_SUCCESS ->
        Log.d("MY_APP_TAG", "App can authenticate using biometrics.")
    BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE ->
        Log.e("MY_APP_TAG", "No biometric features available on this device.")
    BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE ->
        Log.e("MY_APP_TAG", "Biometric features are currently unavailable.")
    BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> {
        // Prompts the user to create credentials that your app accepts.
        val enrollIntent = Intent(Settings.ACTION_BIOMETRIC_ENROLL).apply {
            putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED,
                BIOMETRIC_STRONG or DEVICE_CREDENTIAL)
        }
        startActivityForResult(enrollIntent, REQUEST_CODE)
    }
}

Java

BiometricManager biometricManager = BiometricManager.from(this);
switch (biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)) {
    case BiometricManager.BIOMETRIC_SUCCESS:
        Log.d("MY_APP_TAG", "App can authenticate using biometrics.");
        break;
    case BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE:
        Log.e("MY_APP_TAG", "No biometric features available on this device.");
        break;
    case BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE:
        Log.e("MY_APP_TAG", "Biometric features are currently unavailable.");
        break;
    case BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED:
        // Prompts the user to create credentials that your app accepts.
        final Intent enrollIntent = new Intent(Settings.ACTION_BIOMETRIC_ENROLL);
        enrollIntent.putExtra(Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED,
                BIOMETRIC_STRONG | DEVICE_CREDENTIAL);
        startActivityForResult(enrollIntent, REQUEST_CODE);
        break;
}

איך לקבוע איך המשתמש ביצע אימות

אחרי שהמשתמש מבצע אימות, אפשר לבדוק אם המשתמש ביצע אימות באמצעות פרטי כניסה של מכשיר או מידע ביומטרי באמצעות התקשרות getAuthenticationType()

הצגת ההנחיה להתחברות

כדי להציג בקשה מהמערכת למשתמש לבצע אימות באמצעות פרטי כניסה ביומטריים, משתמשים בספרייה הביומטרית. תיבת הדו-שיח הזו שסופקת על ידי המערכת עקבית בכל האפליקציות שמשתמשות בה, וכך יוצרת חוויית משתמש אמינה יותר. תיבת דו-שיח לדוגמה מופיעה באיור 1.

צילום מסך שבו מוצגת תיבת דו-שיח
איור 1. תיבת דו-שיח של המערכת שבה מופיעה בקשה לביצוע אימות ביומטרי.

כדי להוסיף אימות ביומטרי לאפליקציה באמצעות הספרייה הביומטרית: מבצעים את השלבים הבאים:

  1. בקובץ build.gradle של מודול האפליקציה, מוסיפים תלות בספרייה androidx.biometric.

  2. בפעילות או בחלק שמארחים את תיבת הדו-שיח של הכניסה הביומטרית, מציגים את תיבת הדו-שיח באמצעות הלוגיקה שמופיעה בקטע הקוד הבא:

    Kotlin

    private lateinit var executor: Executor
    private lateinit var biometricPrompt: BiometricPrompt
    private lateinit var promptInfo: BiometricPrompt.PromptInfo
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        executor = ContextCompat.getMainExecutor(this)
        biometricPrompt = BiometricPrompt(this, executor,
                object : BiometricPrompt.AuthenticationCallback() {
            override fun onAuthenticationError(errorCode: Int,
                    errString: CharSequence) {
                super.onAuthenticationError(errorCode, errString)
                Toast.makeText(applicationContext,
                    "Authentication error: $errString", Toast.LENGTH_SHORT)
                    .show()
            }
    
            override fun onAuthenticationSucceeded(
                    result: BiometricPrompt.AuthenticationResult) {
                super.onAuthenticationSucceeded(result)
                Toast.makeText(applicationContext,
                    "Authentication succeeded!", Toast.LENGTH_SHORT)
                    .show()
            }
    
            override fun onAuthenticationFailed() {
                super.onAuthenticationFailed()
                Toast.makeText(applicationContext, "Authentication failed",
                    Toast.LENGTH_SHORT)
                    .show()
            }
        })
    
        promptInfo = BiometricPrompt.PromptInfo.Builder()
                .setTitle("Biometric login for my app")
                .setSubtitle("Log in using your biometric credential")
                .setNegativeButtonText("Use account password")
                .build()
    
        // Prompt appears when user clicks "Log in".
        // Consider integrating with the keystore to unlock cryptographic operations,
        // if needed by your app.
        val biometricLoginButton =
                findViewById<Button>(R.id.biometric_login)
        biometricLoginButton.setOnClickListener {
            biometricPrompt.authenticate(promptInfo)
        }
    }
    

    Java

    private Executor executor;
    private BiometricPrompt biometricPrompt;
    private BiometricPrompt.PromptInfo promptInfo;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        executor = ContextCompat.getMainExecutor(this);
        biometricPrompt = new BiometricPrompt(MainActivity.this,
                executor, new BiometricPrompt.AuthenticationCallback() {
            @Override
            public void onAuthenticationError(int errorCode,
                    @NonNull CharSequence errString) {
                super.onAuthenticationError(errorCode, errString);
                Toast.makeText(getApplicationContext(),
                    "Authentication error: " + errString, Toast.LENGTH_SHORT)
                    .show();
            }
    
            @Override
            public void onAuthenticationSucceeded(
                    @NonNull BiometricPrompt.AuthenticationResult result) {
                super.onAuthenticationSucceeded(result);
                Toast.makeText(getApplicationContext(),
                    "Authentication succeeded!", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onAuthenticationFailed() {
                super.onAuthenticationFailed();
                Toast.makeText(getApplicationContext(), "Authentication failed",
                    Toast.LENGTH_SHORT)
                    .show();
            }
        });
    
        promptInfo = new BiometricPrompt.PromptInfo.Builder()
                .setTitle("Biometric login for my app")
                .setSubtitle("Log in using your biometric credential")
                .setNegativeButtonText("Use account password")
                .build();
    
        // Prompt appears when user clicks "Log in".
        // Consider integrating with the keystore to unlock cryptographic operations,
        // if needed by your app.
        Button biometricLoginButton = findViewById(R.id.biometric_login);
        biometricLoginButton.setOnClickListener(view -> {
                biometricPrompt.authenticate(promptInfo);
        });
    }
    

שימוש בפתרון קריפטוגרפי שתלוי באימות

כדי להגן עוד יותר על מידע רגיש בתוך האפליקציה, אפשר לשלב בקריפטוגרפיה בתהליך העבודה של האימות הביומטרי באמצעות מופע CryptoObject המסגרת תומכת באובייקטים הקריפטוגרפיים הבאים: Signature,‏ Cipher ו-Mac.

אחרי שהמשתמש מבצע אימות באמצעות הנחיה ביומטרית, האפליקציה יכולה לבצע פעולה קריפטוגרפית. לדוגמה, אם תבצעו אימות באמצעות Cipher, האפליקציה תוכל לבצע הצפנה ופענוח באמצעות אובייקט SecretKey.

בקטעים הבאים מפורטות דוגמאות לשימוש באובייקט Cipher ובאובייקט SecretKey להצפנת נתונים. כל דוגמה מתבססת על אמצעי תשלום:

Kotlin

private fun generateSecretKey(keyGenParameterSpec: KeyGenParameterSpec) {
    val keyGenerator = KeyGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
    keyGenerator.init(keyGenParameterSpec)
    keyGenerator.generateKey()
}

private fun getSecretKey(): SecretKey {
    val keyStore = KeyStore.getInstance("AndroidKeyStore")

    // Before the keystore can be accessed, it must be loaded.
    keyStore.load(null)
    return keyStore.getKey(KEY_NAME, null) as SecretKey
}

private fun getCipher(): Cipher {
    return Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
            + KeyProperties.BLOCK_MODE_CBC + "/"
            + KeyProperties.ENCRYPTION_PADDING_PKCS7)
}

Java

private void generateSecretKey(KeyGenParameterSpec keyGenParameterSpec) {
    KeyGenerator keyGenerator = KeyGenerator.getInstance(
            KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
    keyGenerator.init(keyGenParameterSpec);
    keyGenerator.generateKey();
}

private SecretKey getSecretKey() {
    KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");

    // Before the keystore can be accessed, it must be loaded.
    keyStore.load(null);
    return ((SecretKey)keyStore.getKey(KEY_NAME, null));
}

private Cipher getCipher() {
    return Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
            + KeyProperties.BLOCK_MODE_CBC + "/"
            + KeyProperties.ENCRYPTION_PADDING_PKCS7);
}

אימות באמצעות פרטי כניסה ביומטריים בלבד

אם האפליקציה משתמשת במפתח סודי שמחייב פרטים ביומטריים כדי לבטל את הנעילה, המשתמש חייב לאמת את פרטי הכניסה הביומטריים שלו בכל פעם לפני האפליקציה ניגש למפתח.

כדי להצפין מידע רגיש רק אחרי שהמשתמש מבצע אימות באמצעות בפרטי כניסה ביומטריים, מבצעים את השלבים הבאים:

  1. יוצרים מפתח עם ההגדרות הבאות של KeyGenParameterSpec:

    Kotlin

    generateSecretKey(KeyGenParameterSpec.Builder(
            KEY_NAME,
            KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
            .setUserAuthenticationRequired(true)
            // Invalidate the keys if the user has registered a new biometric
            // credential, such as a new fingerprint. Can call this method only
            // on Android 7.0 (API level 24) or higher. The variable
            // "invalidatedByBiometricEnrollment" is true by default.
            .setInvalidatedByBiometricEnrollment(true)
            .build())
    

    Java

    generateSecretKey(new KeyGenParameterSpec.Builder(
            KEY_NAME,
            KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
            .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
            .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
            .setUserAuthenticationRequired(true)
            // Invalidate the keys if the user has registered a new biometric
            // credential, such as a new fingerprint. Can call this method only
            // on Android 7.0 (API level 24) or higher. The variable
            // "invalidatedByBiometricEnrollment" is true by default.
            .setInvalidatedByBiometricEnrollment(true)
            .build());
    
  2. הפעלת תהליך עבודה של אימות ביומטרי שכולל צופן:

    Kotlin

    biometricLoginButton.setOnClickListener {
        // Exceptions are unhandled within this snippet.
        val cipher = getCipher()
        val secretKey = getSecretKey()
        cipher.init(Cipher.ENCRYPT_MODE, secretKey)
        biometricPrompt.authenticate(promptInfo,
                BiometricPrompt.CryptoObject(cipher))
    }
    

    Java

    biometricLoginButton.setOnClickListener(view -> {
        // Exceptions are unhandled within this snippet.
        Cipher cipher = getCipher();
        SecretKey secretKey = getSecretKey();
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        biometricPrompt.authenticate(promptInfo,
                new BiometricPrompt.CryptoObject(cipher));
    });
    
  3. בקריאות החוזרות (callback) של האימות הביומטרי, משתמשים במפתח הסודי כדי להצפין המידע הרגיש:

    Kotlin

    override fun onAuthenticationSucceeded(
            result: BiometricPrompt.AuthenticationResult) {
        val encryptedInfo: ByteArray = result.cryptoObject.cipher?.doFinal(
            // plaintext-string text is whatever data the developer would like
            // to encrypt. It happens to be plain-text in this example, but it
            // can be anything
                plaintext-string.toByteArray(Charset.defaultCharset())
        )
        Log.d("MY_APP_TAG", "Encrypted information: " +
                Arrays.toString(encryptedInfo))
    }
    

    Java

    @Override
    public void onAuthenticationSucceeded(
            @NonNull BiometricPrompt.AuthenticationResult result) {
        // NullPointerException is unhandled; use Objects.requireNonNull().
        byte[] encryptedInfo = result.getCryptoObject().getCipher().doFinal(
            // plaintext-string text is whatever data the developer would like
            // to encrypt. It happens to be plain-text in this example, but it
            // can be anything
                plaintext-string.getBytes(Charset.defaultCharset()));
        Log.d("MY_APP_TAG", "Encrypted information: " +
                Arrays.toString(encryptedInfo));
    }

אימות באמצעות מידע ביומטרי או פרטי כניסה למסך הנעילה

אפשר להשתמש במפתח סודי שמאפשר לבצע אימות באמצעות נתונים ביומטריים פרטי כניסה או פרטי כניסה למסך הנעילה (קוד אימות, קו ביטול נעילה או סיסמה). מתי הגדרת המפתח הזה, קביעת פרק זמן לתוקף. במהלך התקופה הזו, האפליקציה יכולה לבצע מספר פעולות קריפטוגרפיות בלי שהמשתמש יצטרך לצורך אימות מחדש.

כדי להצפין מידע רגיש אחרי שהמשתמש מבצע אימות באמצעות פרטי כניסה ביומטריים או באמצעות מסך הנעילה, מבצעים את הפעולות הבאות:

  1. ליצור מפתח שמשתמש KeyGenParameterSpec תצורה:

    Kotlin

    generateSecretKey(KeyGenParameterSpec.Builder(
        KEY_NAME,
        KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
        .setUserAuthenticationRequired(true)
        .setUserAuthenticationParameters(VALIDITY_DURATION_SECONDS,
                ALLOWED_AUTHENTICATORS)
        .build())
    

    Java

    generateSecretKey(new KeyGenParameterSpec.Builder(
        KEY_NAME,
        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
        .setUserAuthenticationRequired(true)
        .setUserAuthenticationParameters(VALIDITY_DURATION_SECONDS,
                ALLOWED_AUTHENTICATORS)
        .build());
    
  2. תוך פרק זמן של VALIDITY_DURATION_SECONDS אחרי האימות של המשתמש, צריך להצפין את המידע הרגיש:

    Kotlin

    private fun encryptSecretInformation() {
        // Exceptions are unhandled for getCipher() and getSecretKey().
        val cipher = getCipher()
        val secretKey = getSecretKey()
        try {
            cipher.init(Cipher.ENCRYPT_MODE, secretKey)
            val encryptedInfo: ByteArray = cipher.doFinal(
                // plaintext-string text is whatever data the developer would
                // like to encrypt. It happens to be plain-text in this example,
                // but it can be anything
                    plaintext-string.toByteArray(Charset.defaultCharset()))
            Log.d("MY_APP_TAG", "Encrypted information: " +
                    Arrays.toString(encryptedInfo))
        } catch (e: InvalidKeyException) {
            Log.e("MY_APP_TAG", "Key is invalid.")
        } catch (e: UserNotAuthenticatedException) {
            Log.d("MY_APP_TAG", "The key's validity timed out.")
            biometricPrompt.authenticate(promptInfo)
        }
    

    Java

    private void encryptSecretInformation() {
        // Exceptions are unhandled for getCipher() and getSecretKey().
        Cipher cipher = getCipher();
        SecretKey secretKey = getSecretKey();
        try {
            // NullPointerException is unhandled; use Objects.requireNonNull().
            ciper.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] encryptedInfo = cipher.doFinal(
                // plaintext-string text is whatever data the developer would
                // like to encrypt. It happens to be plain-text in this example,
                // but it can be anything
                    plaintext-string.getBytes(Charset.defaultCharset()));
        } catch (InvalidKeyException e) {
            Log.e("MY_APP_TAG", "Key is invalid.");
        } catch (UserNotAuthenticatedException e) {
            Log.d("MY_APP_TAG", "The key's validity timed out.");
            biometricPrompt.authenticate(promptInfo);
        }
    }
    

אימות באמצעות מפתחות לאימות לשימוש חד-פעמי

אפשר לספק תמיכה למפתחות אימות לשימוש במופע של BiometricPrompt כדי להשתמש במפתח כזה, המשתמש צריך להציג פרטי כניסה ביומטריים או פרטי כניסה למכשיר בכל פעם שהאפליקציה צריכה לגשת לנתונים שמאובטחים על ידי המפתח הזה. מפתחות אימות לשימוש יכולים להיות שימושיים לעסקאות בעלות ערך גבוה, כמו ביצוע תשלום בסכום גבוה או עדכון רשומות בריאות של אדם.

כדי לשייך אובייקט BiometricPrompt למפתח לאימות לפי שימוש, מוסיפים קוד דומה לקוד הבא:

Kotlin

val authPerOpKeyGenParameterSpec =
        KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose)
    // Accept either a biometric credential or a device credential.
    // To accept only one type of credential, include only that type as the
    // second argument.
    .setUserAuthenticationParameters(0 /* duration */,
            KeyProperties.AUTH_BIOMETRIC_STRONG or
            KeyProperties.AUTH_DEVICE_CREDENTIAL)
    .build()

Java

KeyGenParameterSpec authPerOpKeyGenParameterSpec =
        new KeyGenParameterSpec.Builder("myKeystoreAlias", key-purpose)
    // Accept either a biometric credential or a device credential.
    // To accept only one type of credential, include only that type as the
    // second argument.
    .setUserAuthenticationParameters(0 /* duration */,
            KeyProperties.AUTH_BIOMETRIC_STRONG |
            KeyProperties.AUTH_DEVICE_CREDENTIAL)
    .build();

אימות ללא פעולה מפורשת מצד המשתמש

כברירת מחדל, המערכת דורשת מהמשתמשים לבצע פעולה ספציפית, בלחיצה על לחצן, לאחר קבלת המידע הביומטרי שלהם. כדאי להשתמש בהגדרה הזו אם באפליקציה מוצגת תיבת דו-שיח לאישור פעולה רגישת או מסוכנת, כמו ביצוע רכישה.

אם באפליקציה מוצגת תיבת דו-שיח לאימות ביומטרי לגבי פעולה שמהווה סיכון נמוך יותר, עם זאת, אפשר לרמוז למערכת שהמשתמש לא צריך מאשרים את האימות. ההצעה הזו יכולה לאפשר למשתמש לצפות בתוכן באפליקציה מהר יותר אחרי ביצוע אימות חוזר באמצעות מודל פסיבי, כמו זיהוי פנים או זיהוי קשתית העין. כדי לספק את הרמז הזה, מעבירים את false setConfirmationRequired().

באיור 2 מוצגות שתי גרסאות של אותו תיבת דו-שיח. לגרסה אחת נדרש תג מפורש פעולה מצד המשתמש, והגרסה השנייה לא עושה זאת.

צילום מסך של תיבת דו-שיח צילום מסך של תיבת דו-שיח
איור 2. אימות פנים ללא אישור המשתמש (למעלה) ועם אישור המשתמש (למטה).

בקטע הקוד הבא מוסבר איך להציג תיבת דו-שיח שלא לדרוש פעולה מפורשת מצד המשתמש כדי להשלים את תהליך האימות:

Kotlin

// Lets the user authenticate without performing an action, such as pressing a
// button, after their biometric credential is accepted.
promptInfo = BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setNegativeButtonText("Use account password")
        .setConfirmationRequired(false)
        .build()

Java

// Lets the user authenticate without performing an action, such as pressing a
// button, after their biometric credential is accepted.
promptInfo = new BiometricPrompt.PromptInfo.Builder()
        .setTitle("Biometric login for my app")
        .setSubtitle("Log in using your biometric credential")
        .setNegativeButtonText("Use account password")
        .setConfirmationRequired(false)
        .build();

אישור להשתמש בפרטי כניסה לא ביומטריים

אם אתם רוצים שהאפליקציה תאפשר אימות באמצעות פרטי כניסה ביומטריים או פרטי כניסה של המכשיר, תוכלו להצהיר שהאפליקציה תומכת בפרטי כניסה של המכשיר על ידי הוספת הערך DEVICE_CREDENTIAL לקבוצת הערכים שאתם מעבירים אל setAllowedAuthenticators().

אם האפליקציה משתמשת כרגע createConfirmDeviceCredentialIntent() או setDeviceCredentialAllowed() כדי לספק את היכולת הזו, צריך לעבור לשימוש ב-setAllowedAuthenticators().

מקורות מידע נוספים

לקבלת מידע נוסף על אימות ביומטרי ב-Android, אפשר לעיין במאמרים הבאים: במשאבי אנוש.

פוסטים בבלוג