Flutter本地认证插件local_auth_windows的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter本地认证插件local_auth_windows的使用

描述

local_auth_windowslocal_auth 的Windows实现。它允许开发者在Flutter应用中利用Windows平台的本地认证功能,如指纹、面部识别等生物特征认证。

使用方法

此插件是推荐使用的(federated plugin),这意味着你可以在你的项目中直接正常使用 local_auth 。当你这样做时,这个包将被自动包含在你的应用程序中,因此你不需要在你的 pubspec.yaml 文件中添加它。然而,如果你要直接导入此包以使用其任何API,则应该像往常一样将其添加到你的 pubspec.yaml 中。

示例代码

下面是一个完整的示例demo,演示了如何在Flutter应用中使用 local_auth_windows 进行设备支持性检查、获取已注册的生物识别信息以及执行身份验证操作。

// 忽略一些警告信息
// ignore_for_file: public_member_api_docs, avoid_print

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:local_auth_platform_interface/local_auth_platform_interface.dart';
import 'package:local_auth_windows/local_auth_windows.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // 定义状态变量
  _SupportState _supportState = _SupportState.unknown;
  bool? _deviceSupportsBiometrics;
  List<BiometricType>? _enrolledBiometrics;
  String _authorized = 'Not Authorized';
  bool _isAuthenticating = false;

  @override
  void initState() {
    super.initState();
    // 检查设备是否支持
    LocalAuthPlatform.instance.isDeviceSupported().then(
      (bool isSupported) => setState(() => _supportState = isSupported
          ? _SupportState.supported
          : _SupportState.unsupported),
    );
  }

  // 检查设备是否支持生物识别
  Future<void> _checkBiometrics() async {
    late bool deviceSupportsBiometrics;
    try {
      deviceSupportsBiometrics =
          await LocalAuthPlatform.instance.deviceSupportsBiometrics();
    } on PlatformException catch (e) {
      deviceSupportsBiometrics = false;
      print(e);
    }
    if (!mounted) {
      return;
    }

    setState(() {
      _deviceSupportsBiometrics = deviceSupportsBiometrics;
    });
  }

  // 获取已注册的生物识别类型
  Future<void> _getEnrolledBiometrics() async {
    late List<BiometricType> availableBiometrics;
    try {
      availableBiometrics =
          await LocalAuthPlatform.instance.getEnrolledBiometrics();
    } on PlatformException catch (e) {
      availableBiometrics = <BiometricType>[];
      print(e);
    }
    if (!mounted) {
      return;
    }

    setState(() {
      _enrolledBiometrics = availableBiometrics;
    });
  }

  // 执行身份验证
  Future<void> _authenticate() async {
    bool authenticated = false;
    try {
      setState(() {
        _isAuthenticating = true;
        _authorized = 'Authenticating';
      });
      authenticated = await LocalAuthPlatform.instance.authenticate(
        localizedReason: 'Let OS determine authentication method',
        authMessages: <AuthMessages>[const WindowsAuthMessages()],
        options: const AuthenticationOptions(
          stickyAuth: true,
        ),
      );
      setState(() {
        _isAuthenticating = false;
      });
    } on PlatformException catch (e) {
      print(e);
      setState(() {
        _isAuthenticating = false;
        _authorized = 'Error - ${e.message}';
      });
      return;
    }
    if (!mounted) {
      return;
    }

    setState(
        () => _authorized = authenticated ? 'Authorized' : 'Not Authorized');
  }

  // 取消正在进行的身份验证
  Future<void> _cancelAuthentication() async {
    await LocalAuthPlatform.instance.stopAuthentication();
    setState(() => _isAuthenticating = false);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: ListView(
          padding: const EdgeInsets.only(top: 30),
          children: <Widget>[
            Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                if (_supportState == _SupportState.unknown)
                  const CircularProgressIndicator()
                else if (_supportState == _SupportState.supported)
                  const Text('This device is supported')
                else
                  const Text('This device is not supported'),
                const Divider(height: 100),
                Text(
                    'Device supports biometrics: $_deviceSupportsBiometrics\n'),
                ElevatedButton(
                  onPressed: _checkBiometrics,
                  child: const Text('Check biometrics'),
                ),
                const Divider(height: 100),
                Text('Enrolled biometrics: $_enrolledBiometrics\n'),
                ElevatedButton(
                  onPressed: _getEnrolledBiometrics,
                  child: const Text('Get enrolled biometrics'),
                ),
                const Divider(height: 100),
                Text('Current State: $_authorized\n'),
                if (_isAuthenticating)
                  ElevatedButton(
                    onPressed: _cancelAuthentication,
                    child: const Row(
                      mainAxisSize: MainAxisSize.min,
                      children: <Widget>[
                        Text('Cancel Authentication'),
                        Icon(Icons.cancel),
                      ],
                    ),
                  )
                else
                  Column(
                    children: <Widget>[
                      ElevatedButton(
                        onPressed: _authenticate,
                        child: const Row(
                          mainAxisSize: MainAxisSize.min,
                          children: <Widget>[
                            Text('Authenticate'),
                            Icon(Icons.perm_device_information),
                          ],
                        ),
                      ),
                    ],
                  ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

enum _SupportState {
  unknown,
  supported,
  unsupported,
}

通过这段代码,你可以:

  • 检查当前设备是否支持生物识别。
  • 获取当前设备上已注册的生物识别类型(如指纹、面部识别等)。
  • 执行生物识别身份验证,并处理成功或失败的情况。
  • 在认证过程中提供取消认证的功能。

希望这段代码可以帮助您理解并集成 local_auth_windows 插件到您的Flutter项目中。如果有任何问题或需要进一步的帮助,请随时提问!


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

1 回复

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


当然,以下是如何在Flutter项目中使用local_auth_windows插件来实现本地认证的示例代码。这个插件允许你在Windows平台上使用Windows Hello或其他生物识别方法进行身份验证。

首先,确保你的Flutter项目已经设置好,并且已经添加了local_authlocal_auth_windows依赖。

  1. pubspec.yaml文件中添加依赖
dependencies:
  flutter:
    sdk: flutter
  local_auth: ^1.0.0  # 请检查最新版本号

dev_dependencies:
  flutter_test:
    sdk: flutter

dependency_overrides:
  local_auth_windows:
    git:
      url: https://github.com/flutter/plugins.git
      path: packages/local_auth/local_auth_windows  # 使用Git路径,因为可能需要最新未发布的功能

注意:由于local_auth_windows可能还未正式发布到pub.dev,这里使用了Git路径来引用。如果你发现它已经被发布,可以直接使用版本号而不是Git路径。

  1. 配置Windows平台

确保你的windows文件夹下的CMakeLists.txtPluginRegistrant.cmake文件已经正确设置来支持插件。这通常在使用flutter create .命令创建Windows项目时自动完成。

  1. 编写Flutter代码

下面是一个简单的示例,展示如何使用local_auth插件进行本地认证:

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

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

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

class AuthenticateButton extends StatefulWidget {
  @override
  _AuthenticateButtonState createState() => _AuthenticateButtonState();
}

class _AuthenticateButtonState extends State<AuthenticateButton> {
  final LocalAuthentication _localAuthentication = LocalAuthentication();
  bool _authenticated = false;

  Future<void> _authenticate() async {
    bool authenticated = false;
    try {
      authenticated = await _localAuthentication.authenticateWithBiometrics(
          localizedReason: 'Please authenticate to continue');
    } on PlatformException catch (e) {
      print("Failed to authenticate: '${e.message}' (${e.code})");
    }

    setState(() {
      _authenticated = authenticated;
    });
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _authenticate,
      child: Text(_authenticated ? 'Authenticated' : 'Authenticate'),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。点击按钮将尝试使用Windows Hello或其他可用的生物识别方法进行身份验证。如果身份验证成功,按钮文本将更改为“Authenticated”。

  1. 运行应用

确保你的Flutter开发环境已经设置好,并且你已经连接了一个Windows设备或模拟器。然后运行以下命令来启动应用:

flutter run -d windows

这个命令将在Windows平台上编译并运行你的Flutter应用。

请注意,由于local_auth_windows插件可能还在开发中,实际使用时可能需要根据最新的文档和API进行调整。此外,确保你的Windows设备支持Windows Hello或其他生物识别方法,并且已经正确配置。

回到顶部