Flutter生物识别签名插件biometric_signature的使用

Flutter生物识别签名插件biometric_signature的使用

插件简介

Biometric Signature 是一个Flutter插件,它简化了将生物识别认证(指纹、面部和虹膜识别)集成到Dart和Flutter应用程序中的过程。该插件旨在提供跨Android和iOS平台的一致用户体验,并具有可自定义的UI组件和高级抽象的生物识别签名管理功能。

功能特性

  • 支持在兼容的Android设备上的StrongBox和iOS设备上的Secure Enclave集成。
  • 支持指纹、面部和虹膜识别(基于设备的能力)。
  • 支持配置兼容设备的设备凭证回退支持。
  • 简单集成到Dart和Flutter应用程序中。
  • 可自定义的签名提示UI组件。
  • 高级抽象以管理生物识别签名。

入门指南

添加依赖

要开始使用Biometric Signature,请按照以下步骤操作:

  1. pubspec.yaml文件中添加包依赖:
dependencies:
  biometric_signature: ^6.2.0

平台支持

Android iOS
Support SDK 23+ 12.0+

iOS集成

对于使用Face ID的设备,需要在Info.plist文件中添加如下内容:

<dict>
    <key>NSFaceIDUsageDescription</key>
    <string>This app is using FaceID for authentication</string>
</dict>

Android集成

  • Activity Changes: 请确保使用的是FragmentActivity而不是普通的Activity,可以通过修改manifest文件或自定义Activity类来实现。
  • Permissions: 更新AndroidManifest.xml文件以包含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>
  1. 导入包:
import 'package:biometric_signature/biometric_signature.dart';
  1. 初始化实例:
final biometricSignature = BiometricSignature();

使用方法

此插件简化了通过生物识别进行服务器端认证的过程。以下是基本使用案例的描述: 当用户注册生物识别时,会生成一对RSA密钥。私钥安全地存储在设备上,而公钥则发送给服务器用于注册。为了认证,用户会被提示使用其生物识别解锁私钥,然后生成加密签名并发送给服务器进行验证。如果服务器成功验证了签名,则返回授权响应。

类方法介绍

createKeys([AndroidConfig config, IosConfig config])

生成新的RSA 2048位密钥对,用于生物识别认证。私钥安全地存储在设备上,而公钥作为base64编码字符串返回。该方法会在创建新密钥之前删除任何已存在的密钥对。

createSignature({Map<String, String> options})

提示用户进行生物识别认证,并使用安全存储的私钥生成RSA PKCS#1v1.5 SHA 256签名。签名后的数据作为base64编码字符串返回。

deleteKeys()

删除用于生物识别认证的现有RSA密钥对。

biometricAuthAvailable()

检查设备是否支持生物识别认证,并返回可用的生物识别类型。

biometricKeyExists({bool checkValidity})

检查设备上是否存在生物识别密钥对,并可选地验证其有效性。

示例代码

下面是一个完整的示例应用,展示了如何使用biometric_signature插件来进行生物识别认证。

import 'package:flutter/material.dart';
import 'package:biometric_signature/biometric_signature.dart';
import 'package:biometric_signature/android_config.dart';
import 'package:biometric_signature/ios_config.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Biometric Signature Example')),
        body: Center(child: BiometricAuthButton()),
      ),
    );
  }
}

class BiometricAuthButton extends StatefulWidget {
  @override
  _BiometricAuthButtonState createState() => _BiometricAuthButtonState();
}

class _BiometricAuthButtonState extends State<BiometricAuthButton> {
  final BiometricSignature _biometricSignature = BiometricSignature();

  Future<void> authenticateWithBiometrics() async {
    try {
      final biometricsType = await _biometricSignature.biometricAuthAvailable();
      if (biometricsType != null && !biometricsType.contains("none")) {
        // Check if keys exist and delete them if they do
        final bool? keyExists = await _biometricSignature.biometricKeyExists(checkValidity: true);
        if (keyExists == true) {
          await _biometricSignature.deleteKeys();
        }

        // Create new keys
        final String? publicKey = await _biometricSignature.createKeys(
          androidConfig: AndroidConfig(useDeviceCredentials: true),
          iosConfig: IosConfig(useDeviceCredentials: false)
        );
        debugPrint("Public Key: $publicKey");

        // Create a signature
        final String? signature = await _biometricSignature.createSignature(
          options: {
            "payload": "Biometric payload",
            "promptMessage": "Authenticate with Biometrics",
            "shouldMigrate": "true",
            "allowDeviceCredentials": "true"
          }
        );
        debugPrint("Signature: $signature");
      } else {
        debugPrint("No biometric authentication available.");
      }
    } on PlatformException catch (e) {
      debugPrint(e.message);
      debugPrint(e.code);
    }
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      child: Text('Authenticate with Biometrics'),
      onPressed: () => authenticateWithBiometrics(),
    );
  }
}

在这个例子中,我们创建了一个简单的Flutter应用程序,其中包含一个按钮,点击该按钮后会触发生物识别认证流程。这个流程包括检查是否有可用的生物识别方式、创建新的密钥对以及生成签名。所有操作都封装在一个异步函数authenticateWithBiometrics中,并且在发生错误时捕获异常信息。


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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用biometric_signature插件来实现生物识别签名的代码示例。这个插件允许用户通过触摸屏幕来绘制签名,并且支持指纹识别或面部识别来验证签名的安全性。

首先,你需要在你的pubspec.yaml文件中添加biometric_signature依赖:

dependencies:
  flutter:
    sdk: flutter
  biometric_signature: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤来使用这个插件:

  1. 导入插件
import 'package:biometric_signature/biometric_signature.dart';
import 'package:flutter/material.dart';
  1. 创建签名页面
class SignaturePage extends StatefulWidget {
  @override
  _SignaturePageState createState() => _SignaturePageState();
}

class _SignaturePageState extends State<SignaturePage> {
  final GlobalKey<BiometricSignatureState> _signatureKey = GlobalKey();
  List<Offset> _points = [];
  String _signatureBase64 = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Signature with Biometric Verification'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            Expanded(
              child: BiometricSignature(
                key: _signatureKey,
                onChanged: (List<Offset> points) {
                  setState(() {
                    _points = points;
                  });
                },
                onClear: () {
                  setState(() {
                    _points = [];
                    _signatureBase64 = '';
                  });
                },
                onSave: (List<Offset> points, String base64) async {
                  setState(() {
                    _points = points;
                    _signatureBase64 = base64;
                  });

                  // 这里可以添加代码来保存签名到服务器或本地存储

                  // 调用生物识别验证
                  bool authenticated = await authenticateUser();
                  if (authenticated) {
                    // 用户验证成功,可以进一步处理签名,比如上传
                    print('User authenticated, signature saved as: $_signatureBase64');
                  } else {
                    // 用户验证失败,清空签名
                    setState(() {
                      _points = [];
                      _signatureBase64 = '';
                    });
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('Biometric authentication failed!')),
                    );
                  }
                },
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                _signatureKey.currentState?.clear();
              },
              child: Text('Clear Signature'),
            ),
          ],
        ),
      ),
    );
  }

  Future<bool> authenticateUser() async {
    // 这里使用local_auth插件进行生物识别验证
    // 首先在pubspec.yaml中添加local_auth依赖
    // dependencies:
    //   local_auth: ^x.y.z  # 请替换为最新版本号

    import 'package:local_auth/local_auth.dart';

    final LocalAuthentication auth = LocalAuthentication();
    bool canCheckBiometrics = await auth.canCheckBiometrics;

    if (!canCheckBiometrics) {
      return false;
    }

    List<BiometricType> availableBiometrics = await auth.getAvailableBiometrics();
    if (availableBiometrics.isEmpty) {
      return false;
    }

    bool authenticated = await auth.authenticateWithBiometrics(
      localizedReason: 'Please authenticate to save your signature',
      stickyAuth: true,
    );

    return authenticated;
  }
}
  1. 运行应用

确保你的设备或模拟器支持生物识别(指纹或面部识别),然后运行你的Flutter应用。用户将能够在屏幕上绘制签名,并在尝试保存签名时被提示进行生物识别验证。

这个示例展示了如何使用biometric_signature插件来捕获用户的签名,并通过local_auth插件来验证用户的生物识别信息。请根据你的实际需求调整代码,比如处理签名数据的保存和上传等。

回到顶部