Flutter生物识别认证插件local_biometrics_auth的使用

Flutter生物识别认证插件local_biometrics_auth的使用

local_biometrics_auth

使用说明

该插件提供了一种通过生物识别认证用户并安全缓存敏感信息(如密码和令牌)的方法。

在支持的设备上,这包括指纹或面部识别等生物识别认证。

功能 Android iOS Windows
支持版本 SDK 16+* 9.0+ Windows 10+

使用方法

首先,我们需要导入插件并初始化 BiometricsAuth 实例:

import 'package:local_biometrics_auth/local_biometrics_auth.dart';

final BiometricsAuth auth = BiometricsAuth.initialise();

检查设备是否支持生物识别

final bool canUseBiometrics = auth.canUseBiometrics;
final bool isBiometricsSetup = await auth.isBiometricsSetup;
  • canUseBiometrics:检查设备是否支持任何一种生物识别选项。
  • isBiometricsSetup:检查设备上的生物识别设置是否已配置。

用户认证

你可以使用以下选项来认证用户:

  • BiometricType.face
  • BiometricType.fingerprint

示例代码:通用认证

try {
  await auth.authenticate().then((value) {
    if (value == BiometricsResponse.success) {
      // 认证成功后,可以保存用户的敏感信息
      auth.setAuthKey(authKey: AuthKey(key: authData));
    }
  });
} catch (e) {
  // 处理错误
}

安全缓存用户数据

  • iOS:使用 Keychain 存储数据。
  • Android:使用 AES 加密,AES 密钥用 RSA 加密,并将 RSA 密钥存储在 KeyStore 中。

保存用户数据

auth.setAuthKey(authKey: AuthKey(key: authData));

获取已保存的数据

示例代码:获取已保存的认证密钥

auth.authenticateAndGetAuthKey().then((value) {
  if (value?.key != null) {
    // 在这里处理认证成功后的逻辑
  }
});

仅使用生物识别认证

要强制使用生物识别认证,可以在初始化时设置 biometricsOnly: true

auth = await BiometricsAuth.initialise(biometricsOnly: true);

注意biometricOnly 在 Windows 上不受支持,因为 Windows 的实现底层 API(Windows Hello)不支持选择认证方式。


iOS 集成

如果要使用 Face ID,需要在 Info.plist 文件中添加以下内容:

<key>NSFaceIDUsageDescription</key>
<string>为什么我的应用使用面部识别?</string>

如果不添加此描述,用户会看到一个提示,表示你的应用尚未更新为使用 Face ID。


Android 集成

更新 Activity

local_biometrics_auth 要求使用 FragmentActivity,而不是普通的 Activity。以下是更新方法:

如果直接使用 FlutterActivity

AndroidManifest.xml 中将其替换为 FlutterFragmentActivity

<activity
  android:name="io.flutter.embedding.android.FlutterFragmentActivity"
  ... />

如果使用自定义 Activity:

修改 MainActivity.javaMainActivity.kt

Java 版本:

import io.flutter.embedding.android.FlutterFragmentActivity;

public class MainActivity extends FlutterFragmentActivity {
    // ...
}

Kotlin 版本:

import io.flutter.embedding.android.FlutterFragmentActivity

class MainActivity : FlutterFragmentActivity() {
    // ...
}

添加权限

在项目的 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.USE_BIOMETRIC"/>

更多关于Flutter生物识别认证插件local_biometrics_auth的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter生物识别认证插件local_biometrics_auth的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用local_biometrics_auth插件进行生物识别认证(如指纹、面部识别等)可以帮助你增强应用的安全性。以下是一个简单的使用指南,帮助你快速集成和使用这个插件。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加local_biometrics_auth插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  local_biometrics_auth: ^1.0.0  # 请使用最新版本

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中导入local_biometrics_auth插件。

import 'package:local_biometrics_auth/local_biometrics_auth.dart';

3. 检查设备是否支持生物识别

在使用生物识别认证之前,你需要检查设备是否支持生物识别功能。

Future<void> checkBiometrics() async {
  final LocalBiometricsAuth localBiometricsAuth = LocalBiometricsAuth();
  bool canCheckBiometrics = await localBiometricsAuth.canCheckBiometrics;
  print('Device supports biometrics: $canCheckBiometrics');
}

4. 获取可用的生物识别类型

你可以获取设备支持的生物识别类型,如指纹、面部识别等。

Future<void> getAvailableBiometrics() async {
  final LocalBiometricsAuth localBiometricsAuth = LocalBiometricsAuth();
  List<BiometricType> availableBiometrics = await localBiometricsAuth.getAvailableBiometrics();
  print('Available biometrics: $availableBiometrics');
}

5. 进行生物识别认证

使用authenticate方法进行生物识别认证。

Future<void> authenticate() async {
  final LocalBiometricsAuth localBiometricsAuth = LocalBiometricsAuth();
  bool isAuthenticated = await localBiometricsAuth.authenticate(
    localizedReason: 'Please authenticate to access the app',
    useErrorDialogs: true,
    stickyAuth: true,
  );
  print('Authentication successful: $isAuthenticated');
}

6. 处理认证结果

根据认证结果,你可以决定是否允许用户继续操作。

Future<void> handleAuthentication() async {
  final LocalBiometricsAuth localBiometricsAuth = LocalBiometricsAuth();
  bool isAuthenticated = await localBiometricsAuth.authenticate(
    localizedReason: 'Please authenticate to access the app',
    useErrorDialogs: true,
    stickyAuth: true,
  );

  if (isAuthenticated) {
    print('Authentication successful. Proceed to the next step.');
  } else {
    print('Authentication failed. Access denied.');
  }
}

7. 完整示例

以下是一个完整的示例,展示了如何检查设备是否支持生物识别、获取可用的生物识别类型以及进行认证。

import 'package:flutter/material.dart';
import 'package:local_biometrics_auth/local_biometrics_auth.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BiometricAuthScreen(),
    );
  }
}

class BiometricAuthScreen extends StatefulWidget {
  [@override](/user/override)
  _BiometricAuthScreenState createState() => _BiometricAuthScreenState();
}

class _BiometricAuthScreenState extends State<BiometricAuthScreen> {
  final LocalBiometricsAuth localBiometricsAuth = LocalBiometricsAuth();
  String _authStatus = 'Not authenticated';

  Future<void> checkBiometrics() async {
    bool canCheckBiometrics = await localBiometricsAuth.canCheckBiometrics;
    setState(() {
      _authStatus = 'Device supports biometrics: $canCheckBiometrics';
    });
  }

  Future<void> getAvailableBiometrics() async {
    List<BiometricType> availableBiometrics = await localBiometricsAuth.getAvailableBiometrics();
    setState(() {
      _authStatus = 'Available biometrics: $availableBiometrics';
    });
  }

  Future<void> authenticate() async {
    bool isAuthenticated = await localBiometricsAuth.authenticate(
      localizedReason: 'Please authenticate to access the app',
      useErrorDialogs: true,
      stickyAuth: true,
    );
    setState(() {
      _authStatus = isAuthenticated ? 'Authentication successful' : 'Authentication failed';
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Biometric Auth Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_authStatus),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: checkBiometrics,
              child: Text('Check Biometrics'),
            ),
            ElevatedButton(
              onPressed: getAvailableBiometrics,
              child: Text('Get Available Biometrics'),
            ),
            ElevatedButton(
              onPressed: authenticate,
              child: Text('Authenticate'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部