当我们被要求开发一个登录屏幕并且有一个“记住我”复选框或自动登录功能时,我们所要做的就是将登录凭据或某种令牌保存到本地存储中。所以,下次我们回到应用程序时,我们发现表单已经填写了我们的凭据,或者更好的是,自动登录将我们从无聊的登录屏幕中解救出来。

太棒了,是的。但是安全呢?

如果我们将用户的凭据存储到 SharedPreferences 中,我们可能会将这些数据暴露给攻击者,而攻击者可能会窃取它们。

幸运的是,Flutter 社区足够大,可以创建一个涵盖此场景的包。

有一个名为flutter_secure_storage的包,由 GitHub 用户mogol创建,它将数据存储到 iOS 的 Keychains 中,并使用 AES 加密和 Android 的 Keystore。Android 版本,从 v5.0.0 开始,它也支持 EncryptedSharedPreferences。

从 4.2.1 升级到 5.0.0 时,您可以通过将 encryptedSharedPreference 参数设置为 true 来迁移到 EncryptedSharedPreferences,如下所述。这将自动迁移所有首选项。然而,这无法撤消。如果您在此之后尝试禁用 encryptedSharedPreference,您将无法读取这些值。您只能阅读启用了 encryptedSharedPreference 的那些。

Android 有一个注意事项:当引入 Keystore 时,此插件仅与 Android SDK 18+ 兼容。

现在看看我们如何将这个插件用于登录屏幕。

这是我们要创建的登录页面。

flutter android13 存储权限 flutter存储token_flutter


当您使用凭据填写表单并按下登录按钮时,您会将它们存储到安全存储中。当您返回应用程序时,您会发现您的凭据已自动填写在表格中。

这是一个简单的登录 UI,其背后包含任何类型的登录业务逻辑。我不会使用任何一种状态管理,只会使用旧的好setState()。这只是一个简单的代码示例来展示包的使用。

好的,让我们编码。

首先,我们需要将包添加到pubspec.yaml文件中。

flutter android13 存储权限 flutter存储token_ui_02


是的,但是…如何flutter_secure_storage工作?

正如报告中的那样README.md,我们所要做的就是:

flutter android13 存储权限 flutter存储token_flutter_03


这是一个非常简单的包,是的。

如您所见,在第 4 行,我们创建了一个存储,使我们能够读取和存储数据。

在第 7 行,我们读取并解密由标签标识的 String 值,如果不在存储中,则为keynull 。key请记住:key不应为空。

在第 19 行,我们存储并加密value由标签标识的对象key。如果key已经在存储中,则其关联value将被更改。如果value为空,则删除与value给定的关联key。

对于我们的用例,我们需要:

  • FlutterSecureStorage存储实例;
  • 两个TextEditingController与两个TextInputField小部件关联以收集用户凭据;
  • 一种将write数据存储起来的方法;
  • 一种read从存储中获取数据的方法;

所以让我们定义前两点:)

flutter android13 存储权限 flutter存储token_ui_04


然后,我们定义_onFormSubmit()存储用户凭据的方法。Sing In此方法是与按钮关联的操作。仅当验证表单时,该方法才会负责将数据保存在存储中。

flutter android13 存储权限 flutter存储token_android_05


然后,我们定义方法_readFromStorage()。我们从 中调用这个方法initState(),这样在构建我们的 UI 之前就会检索到存储中的信息。

在创建 State 时,从框架中调用 initState() 方法。(所以它只被调用一次,在 UI 被绘制之前)。

flutter android13 存储权限 flutter存储token_安全_06


通过这种方式,我们得到了以下屏幕截图中显示的行为。

在第一次登录时,用户输入他们的凭据并按下登录按钮。

稍后,当他再次打开应用程序时,他会发现他的凭据已经输入到表单中。

flutter android13 存储权限 flutter存储token_flutter_07


flutter android13 存储权限 flutter存储token_安全_08


做得好!这些简单的说明将允许您向应用程序添加自动登录功能,但最重要的是,存储的信息将在安全存储中加密。

通过这些简单的步骤,您的应用程序将升级。

结论

flutter_secure_storage 是一个非常简单的包,只需几个简单的步骤,我们就可以将用户数据加密保存在安全存储中。