बायोमेट्रिक ऑथेंटिकेशन डायलॉग दिखाएं

अपने ऐप्लिकेशन में संवेदनशील जानकारी या प्रीमियम कॉन्टेंट को सुरक्षित रखने का एक तरीका, बायोमेट्रिक पुष्टि का अनुरोध करना है. जैसे, चेहरे की पहचान या फ़िंगरप्रिंट की पहचान करने की सुविधा का इस्तेमाल करना. इस गाइड में, अपने ऐप्लिकेशन में बायोमेट्रिक लॉगिन फ़्लो को इस्तेमाल करने का तरीका बताया गया है.

आम तौर पर, किसी डिवाइस पर पहली बार साइन इन करने के लिए, आपको 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 (एपीआई लेवल 29) और उससे पहले के वर्शन पर नहीं किया जा सकता: DEVICE_CREDENTIAL और BIOMETRIC_STRONG | DEVICE_CREDENTIAL. Android 10 और इससे पहले के वर्शन पर, डिवाइस पर पिन, पैटर्न या पासवर्ड सेट है या नहीं, यह पता करने के लिए KeyguardManager.isDeviceSecure() वाला तरीका अपनाएं.

देखें कि बायोमेट्रिक ऑथेंटिकेशन की सुविधा उपलब्ध है या नहीं

यह तय करने के बाद कि आपका ऐप्लिकेशन पुष्टि करने के किन एलिमेंट के साथ काम करता है, देखें कि ये एलिमेंट उपलब्ध हैं या नहीं. ऐसा करने के लिए, setAllowedAuthenticators() तरीके का इस्तेमाल करके बताए गए टाइप के बिटवाइज़ कॉम्बिनेशन को canAuthenticate() तरीके में पास करें. अगर ज़रूरी हो, तो ACTION_BIOMETRIC_ENROLL इंटेंट ऐक्शन को शुरू करें. इंटेंट एक्सट्रा में, पुष्टि करने वाले उन तरीकों का सेट दें जिन्हें आपका ऐप्लिकेशन स्वीकार करता है. यह इंटेंट, उपयोगकर्ता को ऐसे पुष्टि करने वाले टूल के लिए क्रेडेंशियल रजिस्टर करने के लिए कहता है जिसे आपका ऐप्लिकेशन स्वीकार करता है.

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. अपने ऐप्लिकेशन मॉड्यूल की 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. बायोमेट्रिक से पुष्टि करने की सुविधा के कॉलबैक में, संवेदनशील जानकारी को एन्क्रिप्ट करने के लिए सीक्रेट कुंजी का इस्तेमाल करें:

    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() तरीके में पास करें.

दूसरी इमेज में, एक ही डायलॉग के दो वर्शन दिखाए गए हैं. एक वर्शन के लिए, उपयोगकर्ता की साफ़ तौर पर कार्रवाई ज़रूरी है, जबकि दूसरे वर्शन के लिए ऐसा नहीं है.

डायलॉग का स्क्रीन कैप्चर डायलॉग का स्क्रीन कैप्चर
दूसरी इमेज. उपयोगकर्ता की पुष्टि के बिना चेहरे की पहचान करने की सुविधा (ऊपर) और उपयोगकर्ता की पुष्टि के साथ चेहरे की पहचान करने की सुविधा (नीचे).

नीचे दिए गए कोड स्निपेट में, ऐसा डायलॉग दिखाने का तरीका बताया गया है जिसके लिए पुष्टि करने की प्रोसेस पूरी करने के लिए, उपयोगकर्ता को साफ़ तौर पर कोई कार्रवाई करने की ज़रूरत नहीं होती:

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();

बायोमेट्रिक क्रेडेंशियल के काम न करने पर, अन्य क्रेडेंशियल का इस्तेमाल करने की अनुमति देना

अगर आपको अपने ऐप्लिकेशन में, बायोमेट्रिक या डिवाइस के क्रेडेंशियल का इस्तेमाल करके पुष्टि करने की सुविधा देनी है, तो setAllowedAuthenticators() में पास की जाने वाली वैल्यू के सेट में DEVICE_CREDENTIAL को शामिल करके, यह एलान किया जा सकता है कि आपका ऐप्लिकेशन, डिवाइस के क्रेडेंशियल के साथ काम करता है.

अगर आपका ऐप्लिकेशन फ़िलहाल, यह सुविधा देने के लिए createConfirmDeviceCredentialIntent() या setDeviceCredentialAllowed() का इस्तेमाल करता है, तो setAllowedAuthenticators() का इस्तेमाल करें.

अन्य संसाधन

Android पर बायोमेट्रिक ऑथेंटिकेशन के बारे में ज़्यादा जानने के लिए, यहां दिए गए संसाधन देखें.

ब्लॉग पोस्ट