A Tauri v2 plugin for biometric authentication (Touch ID, Face ID, fingerprint) on Android, macOS, iOS and Windows.
npm install @choochmeque/tauri-plugin-biometry-api


A Tauri plugin for biometric authentication (Touch ID, Face ID, Windows Hello, fingerprint, etc.) with support for macOS, Windows, iOS, and Android.
- 🔐 Biometric authentication (Touch ID, Face ID, Windows Hello, fingerprint)
- 📱 Full support for iOS and Android
- 🖥️ Desktop support for macOS (Touch ID) and Windows (Windows Hello)
- 🔑 Secure data storage with biometric protection (Android/iOS/macOS/Windows)
- 🎛️ Fallback to device passcode/password
- 🛡️ Native security best practices
- ⚡ Proper error handling with detailed error codes
Add the plugin to your Cargo.toml:
``toml`
[dependencies]
tauri-plugin-biometry = "0.2"
Install the JavaScript/TypeScript API:
`bash`
npm install @choochmeque/tauri-plugin-biometry-apior
yarn add @choochmeque/tauri-plugin-biometry-apior
pnpm add @choochmeque/tauri-plugin-biometry-api
Register the plugin in your Tauri app:
`rust`
fn main() {
tauri::Builder::default()
.plugin(tauri_plugin_biometry::init())
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
Add NSFaceIDUsageDescription to your Info.plist:
`xml`
The plugin automatically handles the necessary permissions for Android.
Configure the plugin permissions in your capabilities/default.json:
`json`
{
"permissions": {
["biometry:default"]
}
}
`typescript
import { checkStatus } from '@choochmeque/tauri-plugin-biometry-api';
const status = await checkStatus();
console.log('Biometry available:', status.isAvailable);
console.log('Biometry type:', status.biometryType); // 0: None, 1: TouchID, 2: FaceID, 3: Iris, 4: Auto (Windows Hello)
if (status.error) {
console.error('Error:', status.error);
console.error('Error code:', status.errorCode);
}
`
`typescript
import { authenticate } from '@choochmeque/tauri-plugin-biometry-api';
try {
await authenticate('Please authenticate to continue', {
allowDeviceCredential: true,
cancelTitle: 'Cancel',
fallbackTitle: 'Use Passcode',
title: 'Authentication Required',
subtitle: 'Access your secure data',
confirmationRequired: false
});
console.log('Authentication successful');
} catch (error) {
console.error('Authentication failed:', error);
}
`
`typescript
import { setData, getData, hasData, removeData } from '@choochmeque/tauri-plugin-biometry-api';
// Store data with biometric protection
await setData({
domain: 'com.myapp',
name: 'api_key',
data: 'secret-api-key-123'
});
// Check if data exists
const exists = await hasData({
domain: 'com.myapp',
name: 'api_key'
});
// Retrieve data (will prompt for biometric authentication)
if (exists) {
const response = await getData({
domain: 'com.myapp',
name: 'api_key',
reason: 'Access your API key'
});
console.log('Retrieved data:', response.data);
}
// Remove data
await removeData({
domain: 'com.myapp',
name: 'api_key'
});
`
`typescript
enum BiometryType {
None = 0,
TouchID = 1,
FaceID = 2,
Iris = 3,
Auto = 4 // Windows Hello (auto-detects available biometry)
}
interface Status {
isAvailable: boolean;
biometryType: BiometryType;
error?: string;
errorCode?: string;
}
interface AuthOptions {
allowDeviceCredential?: boolean; // Allow fallback to device passcode
cancelTitle?: string; // iOS/Android: Cancel button text
fallbackTitle?: string; // iOS only: Fallback button text
title?: string; // Android only: Dialog title
subtitle?: string; // Android only: Dialog subtitle
confirmationRequired?: boolean; // Android only: Require explicit confirmation
}
`
#### checkStatus(): Promise
Checks if biometric authentication is available on the device.
#### authenticate(reason: string, options?: AuthOptions): Promise
Prompts the user for biometric authentication.
#### hasData(options: DataOptions): Promise
Checks if secure data exists for the given domain and name.
#### getData(options: GetDataOptions): Promise
Retrieves secure data after biometric authentication.
#### setData(options: SetDataOptions): Promise
Stores data with biometric protection.
#### removeData(options: RemoveDataOptions): Promise
Removes secure data.
- Supports Touch ID and Face ID
- Requires NSFaceIDUsageDescription in Info.plist for Face IDfallbackTitle
- Fallback button can be customized with
- Supports fingerprint, face, and iris recognition
- Dialog appearance can be customized with title and subtitleconfirmationRequired
- Supports for additional security
- Supports Touch ID
- Full keychain integration for secure data storage
- Same API as iOS for consistency
- Requires user authentication for data access
- Important: The app must be properly code-signed to use keychain data storage. Without proper signing, data storage operations may fail with errors
- Supports Windows Hello (fingerprint, face, PIN)
- Full secure data storage using Windows Hello credentials
- Data is encrypted using AES-256 with Windows Hello protected keys
- Note: setData will prompt for Windows Hello authentication when storing dataBiometryType.Auto
- Automatically focuses Windows Hello dialog
- Returns as it uses Windows Hello's automatic selection
Common error codes returned by the plugin:
- userCancel - User cancelled the authenticationauthenticationFailed
- - Authentication failed (wrong biometric)biometryNotAvailable
- - Biometry is not available on devicebiometryNotEnrolled
- - No biometric data is enrolledbiometryLockout
- - Too many failed attempts, biometry is lockedsystemCancel
- - System cancelled the operation (device busy)appCancel
- - Application cancelled the operationinvalidContext
- - Invalid authentication contextnotInteractive
- - Non-interactive authentication not allowedpasscodeNotSet
- - Device passcode not setuserFallback
- - User chose to use fallback authenticationitemNotFound
- - Keychain item not found (macOS/iOS)authenticationRequired
- - Authentication required but UI interaction not allowedkeychainError
- - Generic keychain operation errorinternalError
- - Internal plugin errornotSupported` - Operation not supported on this platform
-
- All secure data is stored in the system keychain (macOS/iOS), Android Keystore, or Windows Credential Manager
- Data is encrypted and can only be accessed after successful biometric authentication
- The plugin follows platform-specific security best practices
- Windows uses AES-256 encryption with keys derived from Windows Hello credentials
- macOS Code Signing: Your app must be properly code-signed to use keychain storage on macOS. Development builds may work with ad-hoc signing, but production apps require valid Developer ID or App Store signing
- Consider implementing additional application-level encryption for highly sensitive data
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the MIT License.
Built with Tauri - Build smaller, faster
and more secure desktop applications with a web frontend.