【问题标题】:How do you configure local_auth in flutter correctly if you want to secure the whole app with it (e.g. bank apps)?如果你想用它来保护整个应用程序(例如银行应用程序),你如何正确配置 local_auth?
【发布时间】:2020-06-21 10:50:22
【问题描述】:

我们有一个问题,我们想用指纹/TouchID/FaceID 保护整个应用程序。这里我只会提到指纹,它总是指local_auth的所有生物特征。这部分地与函数“didChangeAppLifecycleState”配合得很好,但只是部分地。

由于在 iOS 下,应用程序在查询指纹时变为非活动状态,因此在“AppLifecycleState.resumed”处查询时,查询会进入连续循环。因此,我们在“AppLifecycleState.pause”处设置了一个时间戳,并仅在应用程序暂停后 x 秒后才在恢复时查询指纹。我们现在也将其设置为稍高的时间,这样如果您必须从应用程序切换到相机,锁定不会立即继续。当然还有更多的检查,但这是目前的基本思路。

  1. 这里是flutter需要一些时间执行暂停的问题。 iOS 和安卓都有。因此,如果您现在快速最小化应用程序并再次打开它(因为最小化可能是一个意外?),指纹直接来了。没什么严重的,但不愉快。

  2. 我们真正的问题,我无法真正理解,因为我也不知道如何调试它。如果长时间没有使用该应用程序,尤其是在周末之后的星期一,那么工作同事会遇到一个问题,他们可以简单地启动应用程序而无需指纹。到目前为止只注意到iOS下,因为同事都使用iOS,但不排除在Android下也可能发生。

我只是不知道如何解决它。有没有人有这方面的经验?或者有没有一种非常简单的方法可以在flutter中使用指纹,这样你就可以只用指纹打开应用程序,可能在与“@987654324”完全不同的地方@"?

亲切的问候, 雅各布

【问题讨论】:

  • 嗨,Jacob,你找到解决办法了吗?
  • @VCezar 不是真的,对不起。我们现在使用一个更复杂的解决方案与 bloc 模式。

标签: android ios flutter fingerprint touch-id


【解决方案1】:

据我了解,您正在使用生命周期挂钩来提示进行生物特征验证,但您遇到了问题。如果我理解您的问题,以下是解决方案。

首先而不是使用生命周期来验证生物特征检查。您能否在打开应用程序之前不使用每次都会调用的初始化小部件。这是一个例子。

class Initialize extends StatefulWidget {
  _InitializeState createState() => _InitializeState();
}

class _InitializeState extends State<Initialize> {
  void initState() {
    super.initState();
    _initialize();
  }

  Future<void> _initialize() async {

final userDetails = await getUserSavedDetailsFromStroage();
await doAnyOtherTask();

final user = authService.checkIfPrevLoggedIn(authDetails);

if (user == null) {
  _gotoLogin();
} else {
  if (userDetails.biometricEnabled) {
    final verified = await biometricService.onBiometricVerify();
    if (!verified) {
      _gotoLogin();
      return;
    }
  }
  authService.refreshUser();
  _gotoHomePage();
}
  }

  @override
  Widget build(BuildContext context) {
    return SplashView();
  }
}

你的 main.dart 文件看起来会像下面这样,我假设你正在使用 Provider 包进行状态管理。

 @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => AuthService.instance,
      child: MaterialApp(
        home: Initialize(),
        title: 'App Title',
      ),
    );
  }
}

【讨论】:

  • 我认为这是不正确的:“每次打开应用程序之前都会调用它”。你必须处理应用程序第一次打开的情况(以上情况属实),以及应用程序在后台恢复后的情况(这种情况我认为不属实)。
【解决方案2】:

您可以设置本地身份验证请求待处理的标志。 如果收到响应,则将标志设置回 false,Futuredelay 为 150 毫秒。

仅当请求未挂起时才在 AppLifecycleState.resumed 中请求本地身份验证。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2011-03-13
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2013-07-22
  • 2019-10-06
相关资源
最近更新 更多