local_biometric 0.0.2 copy "local_biometric: ^0.0.2" to clipboard
local_biometric: ^0.0.2 copied to clipboard

A robust, efficient, and performant local biometric identity plugin for Flutter.

local_biometric #

A robust, efficient, and performant local biometric identity plugin for Flutter. This plugin provides secure biometric authentication with support for cryptographic signatures (RSA/ECDSA) using the Secure Enclave (iOS) and Keystore (Android).

Features #

  • Simple Authentication: Quick biometric presence verification.
  • Encrypted Authentication: Enroll secure identities and sign payloads without exposing private keys.
  • Smart Lockout Recovery: Proactively detects biometric lockout states and provides a unified flow to re-enable biometrics using the device passcode.
  • Consistent Behavior: Unified authentication experience across iOS and Android, specifically handling fallback and lockout behaviors consistently.
  • Platform Specifics: Leverages native security hardware (Secure Enclave/StrongBox).

Installation #

Add local_biometric to your pubspec.yaml:

dependencies:
  local_biometric: ^0.0.2

iOS Configuration #

Add NSFaceIDUsageDescription to your Info.plist:

<key>NSFaceIDUsageDescription</key>
<string>This app uses Face ID to secure your identities and sign data.</string>

Android Configuration #

Ensure your AndroidManifest.xml includes the biometric permission:

<uses-permission android:name="android.permission.USE_BIOMETRIC" />

Usage #

1. Initialize the Plugin #

final _plugin = LocalBiometric();

2. Check Availability #

Before performing biometric actions, check if the device supports it and if biometrics are enrolled.

final availability = await _plugin.checkAvailability();
if (availability.canAuthenticate) {
  print("Biometrics are ready!");
} else {
  print("Biometrics unavailable: ${availability.reason}");
}

3. Simple Authentication (Presence Verification) #

Verify the user's presence without using cryptographic keys.

final result = await _plugin.verifyPresence(
  promptMessage: 'Please confirm your identity',
  config: PresencePromptConfig(
    allowDeviceCredentials: true, // Allow fallback to passcode
  ),
);

if (result.success) {
  print("Authenticated!");
}

4. Encrypted Authentication (Signing) #

Enrollment

Create a secure key pair protected by biometrics.

final result = await _plugin.enrollIdentity(
  keyAlias: 'my_secure_key',
  config: IdentityEnrollmentConfig(
    signatureType: IdentitySignatureType.rsa,
    enforceBiometric: true,
  ),
);

Signing

Sign data using the enrolled key. This requires biometric authentication by default.

final result = await _plugin.signPayload(
  payload: 'Data to sign',
  keyAlias: 'my_secure_key',
  config: IdentitySignatureConfig(
    allowDeviceCredentials: false, // Force biometric-only for signing
  ),
);

if (result.code == IdentityError.success) {
  print("Signature: ${result.signature}");
}

5. Handling Lockouts #

If a user fails biometric authentication too many times, the system will lock biometrics. local_biometric helps you identify this state.

if (result.code == IdentityError.lockedOut) {
  // Show a dialog to the user
  // On iOS, verifying the passcode via verifyPresence(allowDeviceCredentials: true)
  // will reset the biometric lockout state.
}

Error Codes #

The plugin uses standardized error codes across platforms:

  • success: Operation completed successfully.
  • userCanceled: The user dismissed the biometric prompt.
  • lockedOut: Too many failed attempts. Passcode verification required.
  • notAvailable: Biometrics are not supported on this device.
  • notEnrolled: No biometrics are enrolled on the device.
  • keyNotFound: The requested cryptographic key does not exist.

Limitations & Important Notes #

  • Simulator Limitations: Biometric authentication and secure hardware (Secure Enclave/StrongBox) cannot be fully tested on simulators. A physical device with biometrics is required for testing.
  • Passcode Requirement: Biometrics cannot be enabled or used unless a device passcode/lock is set. If the user removes their device passcode, all enrolled identities will be permanently invalidated.
  • Biometric Enrollment Changes: On iOS, if new biometrics (FaceID/TouchID) are enrolled or existing ones are significantly changed, identities enrolled with enforceBiometric: true may be invalidated depending on system policy.
  • Lockout Reset: A biometric lockout can ONLY be reset by the user successfully entering their device passcode. There is no way to reset this programmatically without user interaction.
  • Hardware Variation: While the plugin attempts to use the most secure hardware available (StrongBox on Android, Secure Enclave on iOS), it will fall back to standard TEE/Keystore if specialized hardware is not available on the device.

Developer Contact #

For support, feature requests, or business inquiries, please visit our Web Portal.

License #

This project is licensed under the MIT License - see the LICENSE file for details.

2
likes
150
points
118
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A robust, efficient, and performant local biometric identity plugin for Flutter.

Repository (GitHub)
View/report issues

License

MIT (license)

Dependencies

flutter, meta, pigeon

More

Packages that depend on local_biometric

Packages that implement local_biometric