إن إحدى طرق حماية المعلومات الحساسة أو المحتوى المتميز داخل المستخدم في طلب المصادقة بالمقاييس الحيوية، مثل استخدام ميزة التعرف على الوجه أو التعرف على بصمة الإصبع. يشرح هذا الدليل كيفية إتاحة مسارات تسجيل الدخول باستخدام المقاييس الحيوية في تطبيقك.
كقاعدة عامة، يجب استخدام مدير بيانات الاعتماد لتسجيل الدخول الأولي على جهاز. يمكن إجراء عمليات إعادة التفويض اللاحقة باستخدام "طلب المقاييس الحيوية" أو "مدير بيانات الاعتماد". تتمثل ميزة استخدام مطالبة المقاييس الحيوية في أنه يوفر المزيد من خيارات التخصيص، بينما يقدم مدير الاعتماد صفحة واحدة التنفيذ عبر كلا المسارين.
يُرجى توضيح أنواع المصادقة التي يتيحها تطبيقك.
لتحديد أنواع المصادقة التي يتيحها تطبيقك، استخدِم واجهة
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
المكتبة.في النشاط أو المقتطف الذي يستضيف مربّع حوار تسجيل الدخول باستخدام المقاييس الحيوية، اعرض مربّع الحوار باستخدام المنطق الموضَّح في مقتطف الرمز التالي:
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); }
المصادقة باستخدام بيانات الاعتماد الحيوية فقط
إذا كان تطبيقك يستخدم مفتاحًا سريًا يتطلّب بيانات اعتماد المقاييس الحيوية لفتح القفل، على المستخدم مصادقة بيانات اعتماد المقاييس الحيوية في كل مرة قبل أن يصل تطبيقك إلى المفتاح.
لتشفير المعلومات الحساسة فقط بعد أن يقوم المستخدم بالمصادقة باستخدام بيانات اعتماد المقاييس الحيوية، أكمِل الخطوات التالية:
أنشئ مفتاحًا يستخدم الإعداد التالي
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());
ابدأ سير عمل المصادقة بالمقاييس الحيوية الذي يتضمّن ترميزًا:
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)); });
ضمن استدعاءات المصادقة بالمقاييس الحيوية، استخدِم المفتاح السري لتشفير البيانات. المعلومات الحساسة:
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)); }
المصادقة باستخدام المقاييس الحيوية أو بيانات اعتماد قفل الشاشة
يمكنك استخدام مفتاح سري يسمح بالمصادقة باستخدام أيّ من المقاييس الحيوية. بيانات الاعتماد أو بيانات اعتماد شاشة القفل (رقم التعريف الشخصي أو النقش أو كلمة المرور). فعندما لضبط هذا المفتاح، حدد فترة زمنية للصلاحية. خلال هذه الفترة الزمنية، يمكن لتطبيقك تنفيذ عمليات تشفير متعددة بدون حاجة المستخدم لإعادة المصادقة
لتشفير المعلومات الحساسة بعد أن يجري المستخدم المصادقة باستخدام المقاييس الحيوية أو بيانات اعتماد شاشة القفل، أكمِل الخطوات التالية:
أنشئ مفتاحًا يستخدم الإعداد التالي
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());
خلال فترة زمنية تبلغ
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 نسختين من مربع الحوار نفسه. تتطلب إحدى الإصدارات بيانًا صريحًا إجراء المستخدم، بينما لا يعمل الإصدار الآخر.
يوضح مقتطف الرمز التالي كيفية تقديم مربع حوار لا طلب إجراء صريح من المستخدم لإكمال عملية المصادقة:
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، يمكنك الرجوع إلى المراجع التالية: