本文概述
在智能手机中输入密码就像是2013-2014。由于对指纹传感器的支持已成为棉花糖(Marshmallow)中Android的本地组成部分, 在Apple中成为了Touch ID, 并且指纹传感器迅速成为了旗舰手机中的标准配置, 因此, 通过轻松地用手指触摸即可轻松解锁某些东西, 因此很容易被损坏。
如果我们的cordova应用程序中的设备上提供了此功能, 我们将不会忘记使用此功能, 而你的应用程序提供了使用它的方法。试想一下, 即时登录, 即时付款等。
要使用Cordova在我们的设备上使用指纹认证, 我们将使用2个插件(分别针对每个已知平台:Android和iOS)。
要求
- 具有指纹读取器支持的设备(iPhone> = 5s(对于苹果机为Apple, Android设备为带有指纹的Android设备))。
请注意, 在每个平台中, 都有一种方法可以检测是否支持指纹, 从而继续为旧设备提供支持。
值得一提的是, 如果你想在Cordova应用程序的初始化时实现此功能(即访问该应用程序, 你需要授予使用指纹的访问权限), 则需要在以下事件的ondeviceready事件期间或之后执行代码。文件:
document.addEventListener("deviceready", function(){
// Here the code to verificate the fingerprint
}, false);
现在你已经了解了基础知识, 让我们开始吧!
安卓系统
对于Android平台, 你需要使用cordova-plugin-android-fingerprint-auth。
该插件是根据Android 6.0 API网页引用的”指纹对话框”示例和”确认凭据”示例创建的。
该插件将打开一个本机对话框片段, 提示用户使用其指纹进行身份验证。如果设备具有安全的锁屏(模式, PIN或密码), 则用户可以选择使用该方法作为备份进行身份验证。
要在你的项目上安装此插件, 请在命令提示符下执行以下命令:
cordova plugin add cordova-plugin-android-fingerprint-auth
REM Or clone the repository
cordova plugin add https://github.com/mjwheatley/cordova-plugin-android-fingerprint-auth.git
成功安装后, 将在名为FingerprintAuth的文档中访问Global变量。该对象有4种可用方法:
- isAvailable(isAvailableSuccess, isAvailableError)
- 加密(encryptConfig, successCallback, errorCallback)
- 解密(decryptConfig, successCallback, errorCallback)
- 删除(deleteConfg, successCallback, errorCallback)
使其工作的逻辑很简单, 检查设备是否具有指纹识别功能(如果已识别并已注册指纹), 然后使用crypto方法显示对话框, 该对话框可验证指纹并加密其中的一些数据, 你以后可以使用解密解密方法。
如果你想使用指纹设备进行身份验证, 那么你正在寻找加密方法。此方法需要一个具有其配置的对象, 下表列出了可用的属性:
参数 | 类型 | default | 描述 |
---|---|---|---|
clientId | String | 未定义 | (必需)用作Android密钥存储区中应用程序密钥的别名。也用作”共享首选项”密钥的一部分, 用于用户加密用户凭据的密码。 |
用户名 | String | 未定义 | 用于创建加密令牌的凭证字符串, 并用作别名以检索密码。 |
密码 | String | 未定义 | 用于创建加密令牌的凭证字符串 |
代币 | String | 未定义 | 要解密的数据。对于delete()是必需的。 |
disableBackup | boolean | false | 设置为true以删除” USE BACKUP”按钮 |
maxAttempts | Number | 5 | 设备最多可尝试5次。如果要允许少于5次尝试, 请设置此参数。 |
地区 | String | ” en_US” | 更改身份验证对话框上显示的语言。英文:” en_US”意大利语:” it”西班牙语:” es”俄语:” ru”法语:” fr”中文(简体):” zh_CN”” zh_SG”中文(繁体):” zh”” zh_HK”” zh_TW” ” zh_MO”挪威文:” no”葡萄牙语:” pt”日语:” ja”德语:” de” |
userAuthRequired | boolean | true | 要求用户使用指纹进行身份验证以授权密钥的每次使用。新的指纹注册将使密钥无效, 并且需要备份身份验证才能重新启用指纹身份验证对话框。 |
dialogTitle | String | 未定义 | 设置指纹认证对话框的标题。 |
dialogMessage | String | 未定义 | 设置指纹认证对话框的消息。 |
dialogHint | String | 未定义 | 设置指纹认证对话框上的指纹图标显示的提示。 |
以下代码段显示了一个非常基本的实现, 并在所有可能的情况下(如果有用于检查指纹的设备并且已注册指纹)处理指纹认证:
注意
以下代码段适用于最新版本。无论如何, 我们鼓励你检查插件的文档以进行可能的更改, 或者更多地了解插件的工作方式。此外, 如你所见, 有很多回调, 为了使代码更有条理, 我们建议你使用Javascript Promises来实现它。
// Check if device supports fingerprint
/**
* @return {
* isAvailable:boolean, * isHardwareDetected:boolean, * hasEnrolledFingerprints:boolean
* }
*/
FingerprintAuth.isAvailable(function (result) {
console.log("FingerprintAuth available: " + JSON.stringify(result));
// If has fingerprint device and has fingerprints registered
if (result.isAvailable == true && result.hasEnrolledFingerprints == true) {
// Check the docs to know more about the encryptConfig object :)
var encryptConfig = {
clientId: "myAppName", username: "currentUser", password: "currentUserPassword", maxAttempts: 5, locale: "en_US", dialogTitle: "Hey dude, your finger", dialogMessage: "Put your finger on the device", dialogHint: "No one will steal your identity, promised"
}; // See config object for required parameters
// Set config and success callback
FingerprintAuth.encrypt(encryptConfig, function(_fingerResult){
console.log("successCallback(): " + JSON.stringify(_fingerResult));
if (_fingerResult.withFingerprint) {
console.log("Successfully encrypted credentials.");
console.log("Encrypted credentials: " + result.token);
} else if (_fingerResult.withBackup) {
console.log("Authenticated with backup password");
}
// Error callback
}, function(err){
if (err === "Cancelled") {
console.log("FingerprintAuth Dialog Cancelled!");
} else {
console.log("FingerprintAuth Error: " + err);
}
});
}
/**
* @return {
* isAvailable:boolean, * isHardwareDetected:boolean, * hasEnrolledFingerprints:boolean
* }
*/
}, function (message) {
console.log("isAvailableError(): " + message);
});
执行加密方法后将显示对话框。简单快速的身份验证, 无需使用任何密码。
iOS
对于iOS平台, 你需要使用cordova-plugin-touch-id。
该插件可让你使用TouchID传感器(iPhone 5S)扫描用户的指纹。
- 与Cordova Plugman兼容。
- iOS的最低版本为8(错误回调将在较低版本上正常调用)。
- 需要指纹扫描仪, 因此需要iPhone 5S或更高版本。
要在你的项目上安装此插件, 请在命令提示符下执行以下命令:
cordova plugin add cordova-plugin-touch-id
#Or clone from the repo
cordova plugin add https://github.com/EddyVerbruggen/cordova-plugin-touch-id
成功安装后, 将在名为touchid的window.plugins中注册一个对象。
首先, 你需要检查用户是否已配置指纹扫描仪(为没有iPhone 5s或更低版本的用户提供备用), 使用成功回调使用其他方法。
window.plugins.touchid.isAvailable(
function() {
alert('available!')
}, // success handler: TouchID available
function(msg) {
alert('not available, message: ' + msg)
} // error handler: no TouchID available
);
如果调用了onSuccess处理程序, 则可以扫描指纹。有两个选项:verifyFingerprint和verifyFingerprintWithCustomPasswordFallback。第一种方法将提供一个称为”输入密码”的后备选项, 该选项会在按下时显示默认的密码UI。第二种方法将提供一个称为”输入密码”(不是密码)的后备选项, 使你可以提供自己的密码对话框。
window.plugins.touchid.verifyFingerprint(
'Scan your fingerprint please', // this will be shown in the native scanner popup
function(msg) {
alert('ok: ' + msg);
}, // success handler: fingerprint accepted
function(msg) {
alert('Something is wrong: ' + JSON.stringify(msg));
} // error handler with errorcode and localised reason
);
上面方法的错误处理程序可能会收到错误代码-2, 这意味着用户按下了”输入密码”后备广告。
window.plugins.touchid.verifyFingerprintWithCustomPasswordFallback(
'Scan your fingerprint please', // this will be shown in the native scanner popup
function(msg) {
alert('ok: ' + msg)
}, // success handler: fingerprint accepted
function(msg) {
alert('not ok: ' + JSON.stringify(msg))
} // error handler with errorcode and localised reason
);
万一无法识别指纹, 这将呈现一个标记为”输入密码”的按钮。如果要提供自己的标签(也许是”输入PIN”), 则可以使用命名函数verifyFingerprintWithCustomPasswordFallbackAndEnterPasswordLabel(在3.1.0版中添加):
window.plugins.touchid.verifyFingerprintWithCustomPasswordFallbackAndEnterPasswordLabel(
'Scan your fingerprint please', // this will be shown in the native scanner popup
'Enter PIN', // this will become the 'Enter password' button label
function(msg) {
alert('ok: ' + msg)
}, // success handler: fingerprint accepted
function(msg) {
alert('not ok: ' + JSON.stringify(msg))
} // error handler with errorcode and localised reason
);
增强iOS上的安全性
从iOS9开始, 可以检查自上次检查以来已注册指纹的列表是否更改。建议你添加此检查, 以便可以对应用程序进行黑客攻击。有关更多详细信息, 请参见本文。
因此, 不要在isAvailable之后检查指纹, 而是添加另一个检查。万一didFingerprintDatabaseChange返回true, 你可能要在再次接受有效指纹之前重新验证用户身份。
window.plugins.touchid.isAvailable(
// success handler; available
function() {
window.plugins.touchid.didFingerprintDatabaseChange(
function(changed) {
if (changed) {
// re-auth the user by asking for his credentials before allowing a fingerprint scan again
} else {
// call the fingerprint scanner
}
}
);
}, // error handler; not available
function(msg) {
// use a more traditional auth mechanism
}
);
多平台包装
随着插件代码的变化, 你需要检查设备的操作系统是iOS还是Android, 以防止错误。如果你在两个平台上都工作, 则可以使用以下包装器功能来检查何时使用哪个代码:
function verifyFingerprint(callbacks){
var triggerCallbackIfExists = function(callback_name){
if(typeof(callbacks[callback_name]) == "function"){
// Execute function
callbacks[callback_name]();
}
};
// if IOS
if(!!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)){
triggerCallbackIfExists("ios");
// If Android
}else if(navigator.userAgent.toLowerCase().indexOf("android") > -1){
triggerCallbackIfExists("android");
// If other OS
}else{
triggerCallbackIfExists("others");
}
}
并像这样使用它:
verifyFingerprint({
ios: function(){
// Here the code to verify the fingerprint only on IOS
}, android: function(){
// Here the code to verify the fingerprint only in Android
}, others: function(){
// alert("There's no plugin to verify fingerprint in this platform");
}
});
请注意, 你可以自行检查设备是否支持带有插件本身的指纹功能。
玩得开心