この記事は、【 可茂IT塾 Advent Calendar 2023 】の18日目の記事です。
この記事では、Flutter
アプリケーションに生体認証(指紋認証や顔認証など)を組み込む方法について説明します。
生体認証を実装することで、セキュリティを強化したユーザー体験を提供できます。
local_auth
パッケージのセットアップdependencies:
flutter:
sdk: flutter
local_auth: ^2.1.7
flutter pub get
android/app/src/main/AndroidManifest.xml
にandroid.permission.USE_BIOMETRIC
のパーミッションを追加します。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app">
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
<manifest>
Info.plist
に以下の記述を追加し、プライバシーの説明を記述します。
<key>NSFaceIDUsageDescription</key>
<string>このアプリではFace IDを使用して認証を行います</string>
設定したメッセージは以下のように表示されます。
生体認証を実装する上での下準備が完了したところで、いよいよアプリ側での実装を行なっていきます。
以下がアプリ全体のコードとなってます。
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:local_auth/local_auth.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
Widget build(BuildContext context) {
return MaterialApp(
title: 'BioAuth Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final LocalAuthentication auth = LocalAuthentication();
String _authorized = '未認証';
Future<void> _authenticate() async {
bool authenticated = false;
try {
authenticated = await auth.authenticate(
localizedReason: '生体認証でログインしてください',
options: const AuthenticationOptions(
stickyAuth: true,
biometricOnly: true,
),
);
} catch (e) {
print(e);
}
if (!mounted) return;
setState(() {
_authorized = authenticated ? '認証成功' : '認証失敗';
});
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('BioAuth Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('認証状態: $_authorized'),
const Gap(20),
ElevatedButton(
onPressed: _authenticate,
child: const Text('認証'),
),
],
),
),
);
}
}
上記をbuildして、認証ボタンをタップすると以下のような生体認証ダイアログが表示されます。
認証周りのメソッドは以下の部分です。
Future<void> _authenticate() async {
bool authenticated = false;
try {
authenticated = await auth.authenticate(
localizedReason: '生体認証でログインしてください',
options: const AuthenticationOptions(
stickyAuth: true,
biometricOnly: true,
),
);
} catch (e) {
print(e);
}
if (!mounted) return;
setState(() {
_authorized = authenticated ? '認証成功' : '認証失敗';
});
}
上記の実装において、一部コードの説明を行なっていきます。
stickyAuth: true,
stickyAuth
は、trueに設定することで、システムによってアプリがバックグラウンドになってもプラグイン側が認証失敗を返さないようにすることができます。
つまり、認証時に電話や他のアプリを開いた状態から、再度認証画面に戻ってきた際に、認証を再試行されます。
biometricOnly: true,
biometricOnly
は、trueに設定することで、生体認証以外のローカル認証をしないようになります。
生体認証に成功した場合と失敗した場合は以下のように表示されます。
いかがでしたでしょうか?
生体認証の実装はlocal_auth
のパッケージを使用することで、手軽に実装することができたと思います。
生体認証の実装を考えられている方の手助けになれば幸いです。
普段よく使われている方も多いのではないかと思いますが、今回のUIの実装で使ったGap
というパッケージはすごく便利ですよね。
widget同士の距離の指定の際に、Gap
だとwidthやheightを指定しなくて済むのは、デベロッパーファーストでありがたいです。
https://pub.dev/packages/local_auth (生体認証のドキュメント)
https://pub.dev/packages/gap/example (Gapのドキュメント)
可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。
Read More