@aparajita/capacitor-biometric-auth
Version:
Provides access to the native biometric auth & device security APIs for Capacitor apps
306 lines (305 loc) • 11.8 kB
TypeScript
import type { PluginListenerHandle, WebPlugin } from '@capacitor/core';
/**
* The type of biometry supported by the device.
*/
export declare enum BiometryType {
none = 0,
/**
* iOS Touch ID
*/
touchId = 1,
/**
* iOS Face ID
*/
faceId = 2,
/**
* Android fingerprint authentication
*/
fingerprintAuthentication = 3,
/**
* Android face authentication
*/
faceAuthentication = 4,
/**
* Android iris authentication
*/
irisAuthentication = 5
}
export declare enum AndroidBiometryStrength {
/**
* `authenticate()` will present any available biometry.
*/
weak = 0,
/**
* `authenticate()` will only present strong biometry.
*/
strong = 1
}
export interface AuthenticateOptions {
/**
* Displays the reason for requesting authentication in the authentication
* dialog presented to the user.
*
* Default: System default
*/
reason?: string;
/**
* iOS:
* The system presents a cancel button during biometric authentication
* to let the user abort the authentication attempt. The button appears
* every time the system asks the user to present a finger registered with
* Touch ID. For Face ID, the button only appears if authentication fails
* and the user is prompted to try again. Either way, the user can stop
* trying to authenticate by tapping the button.
*
* Android:
* The text for the negative button. This would typically be used as a
* "Cancel" button, but may be also used to show an alternative method
* for authentication, such as a screen that asks for a backup password.
*
* Default: "Cancel"
*/
cancelTitle?: string;
/**
* If true, allows for authentication using device unlock credentials.
*
* Default: false.
*
* iOS:
* If biometry is available, enrolled, and not disabled, the system uses that
* first. After the first Touch ID failure or second Face ID failure, if
* `iosFallbackTitle` is not an empty string, a fallback button appears in
* the authentication dialog. If the user taps the fallback button, the
* system prompts the user for the device passcode or the user’s password.
* If `iosFallbackTitle` is an empty string, no fallback button will appear.
*
* If no biometry is enrolled and enabled, and a passcode is set, the system
* immediately prompts the user for the device passcode or user’s password.
* Authentication fails with the error code `passcodeNotSet` if the device
* passcode isn’t enabled.
*
* If a passcode is not set on the device, a `passcodeNotSet` error is
* returned.
*
* The system disables passcode authentication after 6 unsuccessful attempts,
* with progressively increasing delays between attempts.
*
* The title of the fallback button may be customized by setting
* `iosFallbackTitle` to a non-empty string.
*
* Android:
* The user will first be prompted to authenticate with biometrics, but also given
* the option to authenticate with their device PIN, pattern, or password by tapping
* a button in the authentication dialog. The title of the button is supplied by
* the system.
*/
allowDeviceCredential?: boolean;
/**
* The system presents a fallback button when biometric authentication fails
* — for example, because the system doesn’t recognize the presented finger,
* or after several failed attempts to recognize the user’s face.
*
* If `allowDeviceCredential` is false, tapping this button dismisses the
* authentication dialog and returns the error code userFallback. If undefined,
* the localized system default title is used. Passing an empty string
* hides the fallback button completely.
*
* If `allowDeviceCredential` is true and this is undefined,
* the localized system default title is used.
*/
iosFallbackTitle?: string;
/**
* Title for the Android dialog. If not supplied, the system default is used.
*/
androidTitle?: string;
/**
* Subtitle for the Android dialog. If not supplied, the system default is used.
*/
androidSubtitle?: string;
/**
* Determines if successful weak biometric authentication must be confirmed.
*
* For information on this setting, see https://developer.android.com/reference/android/hardware/biometrics/BiometricPrompt.Builder#setConfirmationRequired(boolean).
*
* Default: `true`
*/
androidConfirmationRequired?: boolean;
/**
* Set the strength of Android biometric authentication that will be accepted.
*
* 👉 **NOTE:** On Android 9 & 10 (API 28-29), this will effectively always
* be `.weak` if `allowDeviceCredential` is true. This is a known limitation
* of the Android API. 🤯
*
* Default: `AndroidBiometryStrength.weak`
*/
androidBiometryStrength?: AndroidBiometryStrength;
}
/**
* If the `authenticate()` method throws an exception, the `BiometryError`
* instance contains a `.code` property which will contain one of these strings,
* indicating what the error was.
*
* See https://developer.apple.com/documentation/localauthentication/laerror
* for a description of each error code.
*/
export declare enum BiometryErrorType {
none = "",
appCancel = "appCancel",
authenticationFailed = "authenticationFailed",
invalidContext = "invalidContext",
notInteractive = "notInteractive",
passcodeNotSet = "passcodeNotSet",
systemCancel = "systemCancel",
userCancel = "userCancel",
userFallback = "userFallback",
biometryLockout = "biometryLockout",
biometryNotAvailable = "biometryNotAvailable",
biometryNotEnrolled = "biometryNotEnrolled",
noDeviceCredential = "noDeviceCredential"
}
/**
* `authenticate()` throws instances of this class.
*/
export declare class BiometryError {
message: string;
code: BiometryErrorType;
constructor(message: string, code: BiometryErrorType);
}
export interface CheckBiometryResult {
/**
* True if the device supports *at least* weak biometric authentication
* and the current user has enrolled in some form of biometry. Note that
* if `strongBiometryIsAvailable` is true, this will also be true.
*/
isAvailable: boolean;
/**
* True if the device has strong biometric authentication capability
* and the current user has enrolled in that strong biometry.
*
* On iOS this value and `isAvailable` will always be the same, since iOS
* only supports strong biometry.
*
* On Android, for example, if the device supports both fingerprint
* and face authentication, and the user has enrolled only in face
* authentication, and Android considers face authentication on that
* device to be weak, then `isAvailable` will be true but this value
* will be false.
*/
strongBiometryIsAvailable: boolean;
/**
* The primary (most secure) type of biometry supported by the device.
* Note that _supported_ is not the same as _available_, which requires
* the biometry to be enrolled.
*/
biometryType: BiometryType;
/**
* All of the biometry types supported by the hardware on the device
* (currently only Android devices support multiple biometry types).
* If no biometry is supported, i.e. `biometryType === BiometryType.none`,
* this will be an empty array.
*
* Note that _supported_ is not the same as _available_, which requires
* the biometry to be enrolled.
*/
biometryTypes: BiometryType[];
/**
* Returns true if the device is secure. On iOS, this means that the
* device has a passcode set. On Android, this means that the device
* has a PIN, pattern, or password set.
*/
deviceIsSecure: boolean;
/**
* If weak or better biometry is not available and the system gives
* a reason why, it will be returned here. Otherwise it's an empty string.
*/
reason: string;
/**
* If weak or better biometry is not available, the error code will be
* returned here. Otherwise it's an empty string. The error code will be
* one of the `BiometryErrorType` enum values, and is consistent across
* platforms.
*/
code: BiometryErrorType;
/**
* If strong biometry is not available and the system gives
* a reason why, it will be returned here. Otherwise it's an empty string.
*
* On iOS, this will always be the same as `reason`, since all biometry
* on iOS is strong.
*/
strongReason?: string;
/**
* If strong biometry is not available, the error code will be
* returned here. Otherwise it's an empty string. The error code will be
* one of the `BiometryErrorType` enum values, and is consistent across
* platforms.
*
* On iOS, this will always be the same as `code`, since all biometry
* on iOS is strong.
*/
strongCode?: BiometryErrorType;
}
/**
* The signature of the callback passed to `addResumeListener()`.
*/
export type ResumeListener = (info: CheckBiometryResult) => void;
/**
* This is the public interface of the plugin.
*/
export interface BiometricAuthPlugin extends WebPlugin {
/**
* Check to see what biometry type (if any) is available.
*/
checkBiometry: () => Promise<CheckBiometryResult>;
/**
* web only
*
* On the web, this method allows you to dynamically simulate
* different types of biometry. You may either pass `BiometryType` enums
* or the string names of the `BiometryType` enums. If undefined or a string
* is passed and it isn't a valid value, nothing happens.
*/
setBiometryType: (type: BiometryType | string | Array<BiometryType | string> | undefined) => Promise<void>;
/**
* web only
*
* On the web, this method allows you to dynamically simulate whether or not
* the user has enrolled in biometry.
*/
setBiometryIsEnrolled: (isSecure: boolean) => Promise<void>;
/**
* web only
*
* On the web, this method allows you to dynamically simulate whether or not
* the user has secured the device with a PIN, pattern or passcode.
*/
setDeviceIsSecure: (isSecure: boolean) => Promise<void>;
/**
* Prompt the user for authentication. If authorization fails for any reason,
* the promise is rejected with a `BiometryError`.
*
* For detailed information about the behavior on iOS, see:
*
* https://developer.apple.com/documentation/localauthentication/lapolicy/deviceownerauthenticationwithbiometrics
*
* Some versions of Android impose a limit on the number of failed attempts.
* If `allowDeviceCredential` is `true`, when the limit is reached
* the user will then be presented with a device credential prompt.
* If `allowDeviceCredential` is `false`, when the limit is reached
* `authenticate()` will reject with a `BiometryErrorType` of `biometryLockout`,
* after which the user will have to wait the system-defined length of time
* before being allowed to authenticate again.
*
* @rejects {BiometryError}
*/
authenticate: (options?: AuthenticateOptions) => Promise<void>;
/**
* Register a function that will be called when the app resumes.
* The function will be passed the result of `checkBiometry()`.
*
* 👉 **NOTE:** checkBiometry() must be called at least once
* before calling this method.
*/
addResumeListener: (listener: ResumeListener) => Promise<PluginListenerHandle>;
}