@nativescript/biometrics
适用于 NativeScript 应用程序的生物识别认证插件
npm i --save @nativescript/biometrics

@nativescript/biometrics

npm install @nativescript/biometrics

替代 @nativescript/fingerprint-auth

此插件替代 @nativescript/fingerprint-auth

API

Android 兼容性:API 23+

可用

JavaScript

var biometricAuthPlugin = require('@nativescript/biometrics');
var biometricAuth = new biometricAuthPlugin.BiometricAuth();

biometricAuth.available().then(function (avail) {
console.log('Available? ' + avail);
});

TypeScript

import { BiometricAuth, BiometricIDAvailableResult } from "@nativescript/biometrics";

class MyClass {
private biometricAuth: BiometricAuth;

constructor() {
this.biometricAuth = new BiometricAuth();
}

this.biometricAuth.available().then((result: BiometricIDAvailableResult) => {
console.log(`Biometric ID available? ${result.any}`);
console.log(`Touch? ${result.touch}`);
console.log(`Face? ${result.face}`);
console.log(`Biometrics? ${result.biometrics}`);
});
}

verifyBiometric

请注意,在 iOS 模拟器上,使用 Features->Face ID 菜单项注册面部,并指示成功/失败识别面部。如果使用 pinFallback,verifyBiometric 在 iOS 模拟器上会失败。

biometricAuth
.verifyBiometric({
title: 'Android title', // optional title (used only on Android)
message: 'Scan yer finger', // optional (used on both platforms) - for FaceID on iOS see the notes about NSFaceIDUsageDescription
fallbackMessage: 'Enter your PIN', // this will be the text to show for the "fallback" button on the biometric prompt
pinFallback: true, // allow fall back to pin/password
})
.then((result?: BiometricResult) => {
if (result.code === ERROR_CODES.SUCCESS) {
console.log('Biometric ID OK');
}
})
.catch((err) => console.log(`Biometric ID NOT OK: ${JSON.stringify(err)}`))
;

面部识别(iOS)

iOS 11 添加了对面部识别的支持,并由 iPhone X 首次支持。开发者需要为 NSFaceIDUsageDescription 提供一个值,否则您的应用程序可能会崩溃。

您可以通过将以下内容添加到 app/App_Resources/ios/Info.plist 来提供此值(使用面部识别的原因):

  <key>NSFaceIDUsageDescription</key>
<string>For easy authentication with our app.</string>

Security++(iOS)

从 iOS 9 开始,可以检查注册的指纹列表是否自上次检查以来发生了变化。建议您添加此检查,以便您可以抵御对应用程序的黑客攻击。有关更多详细信息,请参阅这篇文章

因此,在 available 之后检查指纹,您可以添加另一个检查。如果 didFingerprintDatabaseChange 返回 true,则您可能希望在再次接受有效的指纹之前重新验证用户。

biometricAuth.available().then((avail) => {
if (!avail) {
return;
}
biometricAuth.didFingerprintDatabaseChange().then((changed) => {
if (changed) {
// re-auth the user by asking for his credentials before allowing a fingerprint scan again
} else {
// call the fingerprint scanner
}
});
});

生物识别和密码学

正常操作

如果您没有将任何选项(pinFallback / keyName)传递给 verify 方法,则插件将创建一个安全密钥,调用授权方法以触发面部/指纹,然后尝试使用该密钥加密一些文本。其想法是,除非用户已成功认证,否则密钥将不可访问。

然而,这并不是万无一失的,最安全的方法是将 secretKeyname 选项传递给加密/解密文本。

具有身份验证的加密/解密

最佳实践是使用选项加密一些独立验证的机密,这更安全,因为用于解密的密钥无法在不进行适当认证的情况下访问,因此您的机密无法正确解密。

  1. 加密您的机密

    使用相关属性调用 verifyBiometric

    biometricAuth
    .verifyBiometric({
    title: 'Enter your password',
    message: 'Scan yer finger', // optional
    pinFallback: false, // do not allow pinFallback to enable crypto operations
    keyName: 'MySecretKeyName', // The name of the key that will be created/used
    secret: 'The Secret I want encrypted',
    })
    .then((result) => {
    const encryptedText = result.encrypted; // The text encrypted with a key named "MySecretKeyName" (Android Only)
    const IV = result.iv; // the initialization vector used to encrypt (Android Only)

    // For IOS the secret is stored in the keycain
    })
    .catch((err) => this.set('status', `Biometric ID NOT OK: " + ${JSON.stringify(err)}`))
    ;

    对于 Android,加密结果和向量将被存储在您的应用程序中,并在用户下次登录时调用 verifyBiometric 时使用。

  2. 解密您的机密

    biometricAuth
    .verifyBiometric({
    title: 'Enter your password',
    message: 'Scan yer finger', // optional
    keyName: 'MySecretKeyName', // The name of the key that will be created/used
    pinFallback: false, // do not allow pinFallback to enable crypto operations
    android: {
    decryptText: 'The encrypted text retrieved previously',
    iv: 'The IV retrieved previously',
    },
    ios: { fetchSecret: true }, // Tell IOS to fetch the secret
    })
    .then((result) => {
    const decryptedText = result.decrypted; // The unencrypted secret
    verifyMySecret(decryptedText); // verify the secret by some means, e.g. a call to a back end server.
    })
    .catch((err) => this.set('status', `Biometric ID NOT OK: " + ${JSON.stringify(err)}`))
    ;

降级到 PIN

允许用户在锁屏凭据(PIN 等)上进行降级,将禁用密码学。

此外,对于运行 API < 30 的手机,由于调用旧指纹 API,只使用指纹。

例如:

biometricAuth
.verifyBiometric({
title: 'Enter your password',
message: 'Scan yer finger', // optional
fallbackMessage: 'Enter PIN', // optional
pinFallback: true, // do not allow pinFallback to enable crypto operations
ios: { customFallback: false }, // passing true here will show the fallback message and allow you to handle this in a custom manner.
})
.then((result) => {
console.log('Fingerprint/ PIN was OK');
})
.catch((err) => this.set('status', `Biometric ID NOT OK: " + ${JSON.stringify(err)}`))
;

许可

Apache 许可证版本 2.0