在flutter应用程序中保存jwt令牌的最佳方法是什么?

zeu*_*cxb 6 sqlite token jwt flutter

不仅在哪里(sqlite ...),还如何(libs,最佳实践)?

zeu*_*cxb 14

正如我在已删除的帖子中提到的,我一直在使用 hive 来存储我的令牌和其他本地数据。使用hive可以创建一个加密的盒子

import 'dart:typed_data';
import 'package:hive/hive.dart';

void main() async {
  var keyBox = await Hive.openBox('encryptionKeyBox');
  if (!keyBox.containsKey('key')) {
    var key = Hive.generateSecureKey();
    keyBox.put('key', key);
  }

  var key = keyBox.get('key') as Uint8List;
  print('Encryption key: $key');

  var encryptedBox = await Hive.openBox('vaultBox', encryptionKey: key);
  encryptedBox.put('secret', 'Hive is cool');
  print(encryptedBox.get('secret'));
}
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的:

上面的示例将加密密钥存储在一个未加密的盒子中。你永远不应该这样做。

重要的:

  • 只有值被加密,而密钥以明文形式存储。
  • 当您的应用程序关闭时,请确保安全地存储加密密钥。借助 Flutter,您可以使用flutter_secure_storage或类似的包。
  • 不检查加密密钥是否正确。如果不是,则可能会出现意外行为。

因此,如果您不需要任何hive特定功能,flutter_secure_storage应该是您更好的选择。

  • 根据 [Hive 文档](https://docs.hivedb.dev/#/advanced/encrypted_box),使用加密盒时,您需要安全地保存加密密钥。在 Flutter 中,他们建议 [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage#-readme-tab-) 以便您可以保存它。**我的建议:** 使用此选项。 (3认同)
  • 您正在使用未加密的盒子来存储加密密钥。违背了使用加密盒的目的。 (2认同)

Nic*_*muz 12

您可能不想在共享首选项中存储敏感数据。相反,您可能想要研究这样的插件:https : //pub.dartlang.org/packages/flutter_secure_storage

import 'package:flutter_secure_storage/flutter_secure_storage.dart';

// Create storage
final storage = new FlutterSecureStorage();

// Write value 
await storage.write(key: 'jwt', value: token);
Run Code Online (Sandbox Code Playgroud)

  • flutter_secure_storage 从 2022 年 4 月开始支持 web、windows、linux、Macos、android 和 IOS (12认同)
  • flutter_secure_storage 目前不支持 web。有其他支持 flutter web 的替代方案吗? (9认同)

pra*_*oro 6

我使用https://pub.dev/packages/flutter_secure_storage将 JWT 令牌保存在本地存储中。

import 'package:flutter_secure_storage/flutter_secure_storage.dart';

final storage = const FlutterSecureStorage();

// to save token in local storage
await storage.write(key: 'token', value: data.token);

// to get token from local storage
var value = await storage.read(key: 'token');
Run Code Online (Sandbox Code Playgroud)

其他提示:

  • 不要忘记重新构建您的应用程序(有时您需要执行flutter cleanflutter pub get
  • 如果您在 iOS 中运行 cocoapods,请确保它安装正确。
  • 用于安装 cocoapodssudo gem install cocoapods
  • 用于更新 cocoapodssudo gem install cocoapods
  • 就我而言,我需要在安装 cocoapods 后关闭并重新打开 vscode。