NativeScript で生体認証(FaceID, TouchID, Android 指紋認証)
はじめに
NativeScript で iOS の FaceID や TouchID、Android の指紋認証などの生体認証を利用する方法。
TL;DR
- プラグイン: EddyVerbruggen/nativescript-fingerprint-auth
available()
で生体認証の利用可否や種別を取得verifyFingerprint()
,verifyFingerprintWithCustomFallback()
で生体認証- iOS でパスコードにフォールバックさせたい場合、機種や OS によっては README 未記載の
usePasscodeFallback
を指定する必要がある
- iOS でパスコードにフォールバックさせたい場合、機種や OS によっては README 未記載の
目次
環境・条件
1 | $ sw_vers |
- iPhone 11 Pro: iOS 13.3
- Android HUAWEI nova lite 2: Android 9 (ビルド 9.1.0.160)
詳細
リポジトリ: 17number/nativescript-vue-tutorial
参考コミット(時系列順):
セットアップ
インストール
1 | $ tns plugin add nativescript-fingerprint-auth |
Android の minSdkVersion 確認
Installation には、「AndroidManifest.xml
の minSdkVersion
が 23
未満であれば編集」とあるが、minSdkeVersion
の設定がなくてもビルド時にエラーとなったため、一律編集するほうが良いと思われる。
app/App_Resources/Android/src/main/AndroidManifest.xml
を編集。
1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
※自分の環境では <uses-sdk />
自体がなかったので、必要な部分のみを追加している。定義されている場合は tools:overrideLibrary=".."
のみを追加すれば良いと思われる。
FaceID の利用理由 (iOS のみ)
以下画像の赤枠部分を設定したい場合、app/App_Resources/iOS/Info.plist
を編集
参考: Face ID (iOS) - EddyVerbruggen/nativescript-fingerprint-auth
1 | ... |
実装
参考: Demo
nativescript-fingerprint-auth/demo にサンプルがあるので参考に実装すると良い。
ローカルでコード確認や、アプリ実行する場合は git clone
する。
1 | $ git clone https://github.com/EddyVerbruggen/nativescript-fingerprint-auth |
生体認証の 利用可否/種別 の確認
available()
で生体認証の利用可否や種別を取得。
1 | import { FingerprintAuth } from "nativescript-fingerprint-auth"; |
iPhone 11 Pro
1 | // result |
Android HUAWEI nova lite 2 (背面に指紋認証センサーがある)
1 | // result |
生体認証の変更有無の確認
didFingerprintDatabaseChange()
で、生体認証に変更があったかを確認可能。
Since iOS9 it’s possible to check whether or not the list of enrolled fingerprints changed since the last time you checked it. It’s recommended you add this check so you can counter hacker attacks to your app. See this article for more details.
So instead of checking the fingerprint after available add another check. In case didFingerprintDatabaseChange returns true you probably want to re-authenticate your user before accepting valid fingerprints again.
https://github.com/EddyVerbruggen/nativescript-fingerprint-auth#security-ios より
以下は Google 翻訳。(書いてあることはなんとなく分かるが、具体的な利用シーンが思いつかないというのが正直なところ)
iOS9以降、登録した指紋のリストが最後にチェックしてから変更されたかどうかを確認することができます。 アプリへのハッカー攻撃に対抗できるように、このチェックを追加することをお勧めします。 詳細については、この記事を参照してください。
そのため、利用可能な後に指紋をチェックする代わりに、別のチェックを追加します。 didFingerprintDatabaseChangeがtrueを返す場合、おそらく有効な指紋を再度受け入れる前にユーザーを再認証する必要があります。
1 | import { FingerprintAuth } from "nativescript-fingerprint-auth"; |
iPhone 11 Pro
1 | // changed |
Android HUAWEI nova lite 2
1 | // changed |
生体認証(Fallback: パスコード)
verifyFingerprint()
で生体認証の実施。
title
, authenticationValidityDuration
, useCustomAndroidUI
は Android のオプション。message
は iOS, Android 共通、ただし iOS の FaceID 利用時のメッセージは app/App_Resources/iOS/Info.plist
で設定する。
1 | import { FingerprintAuth } from "nativescript-fingerprint-auth"; |
生体認証に成功した場合、enteredPassword
は undefined
となっている。
生体認証に失敗し、パスコードが認証された場合は enteredPassword
が設定されている。説明文を読む限りは、スマホ本体に設定されているパスコードの検証ではなく、事前にアプリ内に設定しておいたパスワードとの一致検証を行う。
- iPhone 11 Pro: FaceID が起動
- Android HUAWEI nova lite 2: 指紋認証が起動
iPhone 11 Pro でパスコードへのフォールバックが発生しない
パスコードでの検証にフォールバックするはずなのだが、iPhone 11 Pro で動作確認したところ、FaceID での認証に失敗してもパスコードでの認証に移行できなかった(ボタン自体が表示されなかった)。
以下を参考に、後述の verifyFingerprintWithCustomFallback()
の第2引数に true
を設定することで、パスコードでの検証にフォールバックできた。
※ただし、 アプリ内に独自に設定したパスコード ではなく、 iPhone 本体のパスコード での検証だった。
- iOS Passcode fallback never presented after failed TouchID · Issue #46 · EddyVerbruggen/nativescript-fingerprint-auth
- iOS Passcode fallback never presented after failed TouchID #46 · EddyVerbruggen/nativescript-fingerprint-auth@e6e737a
以下は実装イメージ。
1 | fingerprintAuth.verifyFingerprintWithCustomFallback({/* ... */}, true) |
Android で生体認証
Android HUAWEI nova lite 2 では、以下のような挙動となった。
useCustomAndroidUI: true
: 指紋認証が起動useCustomAndroidUI: false
: パターンロック認証が起動
1 | fingerprintAuth.verifyFingerprint({ |
※機種、OS version、設定 などによっては、特に何もしなくてもパスコードにフォールバックできるかもしれないが詳細不明。
生体認証(Fallback: カスタム) (iOS のみ)
verifyFingerprintWithCustomFallback()
で、カスタムフォールバックありの生体認証。
前項で書いた通り、第2引数に true
を設定することで、iPhone 本体でのパスコード認証にフォールバック可能。
1 | import { FingerprintAuth } from "nativescript-fingerprint-auth"; |
- iPhone 11 Pro: FaceID が起動 → 認証失敗時パスコード認証に移行可能
Tips
メッセージの変更
参考: optional change
Android でメッセージを変更するには App_Resources/Android/src/main/res/values/strings.xml
を変更すると良いっぽい。
まとめ
- プラグイン: EddyVerbruggen/nativescript-fingerprint-auth
available()
で生体認証の利用可否や種別を取得verifyFingerprint()
,verifyFingerprintWithCustomFallback()
で生体認証- iOS でパスコードにフォールバックさせたい場合、機種や OS によっては README 未記載の
usePasscodeFallback
を指定する必要がある
- iOS でパスコードにフォールバックさせたい場合、機種や OS によっては README 未記載の
参考文献
- EddyVerbruggen/nativescript-fingerprint-auth: 👱♂️ Forget passwords, use a fingerprint scanner or facial recognition!
- iOS Passcode fallback never presented after failed TouchID · Issue #46 · EddyVerbruggen/nativescript-fingerprint-auth
- iOS Passcode fallback never presented after failed TouchID #46 · EddyVerbruggen/nativescript-fingerprint-auth@e6e737a
関連記事
- NativeScript, JsBarcode でバーコードを 生成/描画
- NativeScript でデバイスの輝度(明るさ)を制御する
- NativeScript-Vue でネイテイブアプリの開発(チュートリアル + α)
- NativeScript-Vue で QRコードの読取り
- NativeScript で入力範囲外タップでキーボードを非表示にする
- NativeScript + Firebase でプッシュ通知
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア