はじめに
最近はFlutterの勉強ばかりしていますが、今回は簡単に生体認証が導入できると噂のパッケージ、local_authを使ってみたいと思います
準備
まずはlocal_authをpubspec.yamlに追加しましょう。
1 | flutter pub add local_auth |
pubspec.yamlに追加されていれば成功です。
1 | local_auth: ^2.1.0 |
次は、iOSで使用するために、Info.plistに以下の内容を追加します。
1 2 | <key>NSFaceIDUsageDescription</key> <string>生体認証を使用する目的を記述</string> |
Androidで使用する場合は以下のコードをMainActivity.ktに追記します。
1 2 3 4 5 6 7 8 9 | import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugins.GeneratedPluginRegistrant class MainActivity: FlutterFragmentActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine) } } |
AndroidManifest.xmlにパーミッションを追記します。
1 | <uses-permission android:name="android.permission.USE_FINGERPRINT"/> |
実装
local_authのサンプルコードを使用して解説を行いたいと思います。local_authのサンプルコードはこちらから。
上記の準備が終わっていればサンプルのコピペで動くと思います。
端末が生体認証可能かの確認
まずは端末が生体認証が可能な端末かどうかのチェックを行います。ここではあくまで端末側の仕様確認なので、ユーザーが生体認証の登録を行なっていなくとも端末が生体認証可能であればtrueが返却されます。
1 2 3 4 5 6 7 | late bool canCheckBiometrics; try { canCheckBiometrics = await auth.canCheckBiometrics; } on PlatformException catch (e) { canCheckBiometrics = false; print(e); } |
生体認証の登録状態の確認
次は生体認証の登録状態の確認を行います。こちらは端末にユーザーが登録している生体認証の状況を取得することができます。
1 2 3 4 5 6 7 | late List<BiometricType> availableBiometrics; try { availableBiometrics = await auth.getAvailableBiometrics(); } on PlatformException catch (e) { availableBiometrics = <BiometricType>[]; print(e); } |
何も登録していない場合は空の配列が返却されます。また、返却されるBiometricTypeはenumで以下のように定義されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | enum BiometricType { /// Face authentication. face, /// Fingerprint authentication. fingerprint, /// Iris authentication. iris, /// Any biometric (e.g. fingerprint, iris, or face) on the device that the /// platform API considers to be strong. For example, on Android this /// corresponds to Class 3. strong, /// Any biometric (e.g. fingerprint, iris, or face) on the device that the /// platform API considers to be weak. For example, on Android this /// corresponds to Class 2. weak, } |
生体認証の実行
生体認証を実行します。local_authでは生体認証もできるというだけで、パスコードやジェスチャーなど通常の認証も可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | bool authenticated = false; try { authenticated = await auth.authenticate( localizedReason: 'Scan your fingerprint (or face or whatever) to authenticate', options: const AuthenticationOptions( useErrorDialogs: true, stickyAuth: true, biometricOnly: true, ), ); } on PlatformException catch (e) { print(e); return; } |
auth.authenticateを実行することにより認証を呼び出します。基本的には普段設定している認証が呼び出されますが、AuthenticationOptionsのbiometricOnlyをtrueにすることで、生体認証のみを呼び出すことができます。