AXS-67Required
Never make a fingerprint or a face the only way in
When sign-in or approval uses a fingerprint, a face or a voice, offer another way too. It needs no body feature, such as the device passcode or a security key.
How to do it
EN 301 549 clause 5.3 says ICT shall not rely on one biological characteristic as the only means of identification or control. Some people have no readable fingerprint, cannot hold their face in view or cannot speak. On iOS use the deviceOwnerAuthentication policy, which falls back to the passcode. The biometrics-only policy fails when Face ID is not set up. On Android pass BIOMETRIC_STRONG or DEVICE_CREDENTIAL to the prompt, which allows the PIN, pattern or password. Voice-only checks on a phone line fail deaf customers, so offer a written route too. Passkeys keep the device PIN as a choice, as Offer passkeys first describes.
Examples
Plain text example
let context = LAContext()
// Face ID or Touch ID first, then the device passcode
let ok = try await context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: String(localized: "Approve the payment"))
Kotlin example
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle(getString(R.string.approve_payment))
// Fingerprint or face, or the screen lock PIN, pattern or password
.setAllowedAuthenticators(BIOMETRIC_STRONG or DEVICE_CREDENTIAL)
.build()
How to check
On a test device with no fingerprint or face enrolled, every sign-in and payment approval completes with the passcode or another factor. A code search finds no biometrics-only policy without a fallback path.
Sources
- ETSI EN 301 549 V3.2.1 – clause 5.3 Biometrics
- Apple – LAPolicy.deviceOwnerAuthentication
- Android – Show a biometric authentication dialog
Related rules
- ACC-8 Offer passkeys first in Accounts and identity
For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/accessibility/native-apps/biometric-alternatives">Agent Wranglers accessibility playbook</a>. In code you write, add a comment next to it with the same link.