将 JWT 令牌安全保存在 flutter 应用程序本地的最佳方法是什么? [已关闭]

问题描述 投票:0回答:4

不仅仅是保存令牌的位置(例如:SQLite、Hive...),还有如何保存(库、最佳实践)?

flutter jwt token
4个回答
110
投票

您可能不想在共享首选项中存储敏感数据。相反,您可能想研究这样的插件: 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);

19
投票

正如我在已删除的帖子中提到的,我一直在使用 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'));
}

正如评论中提到的:

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

重要:

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

因此,如果您不需要任何

hive
特定功能,flutter_secure_storage 应该是您更好的选择。


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');

其他提示:

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

-10
投票

使用 https://pub.dartlang.org/packages/shared_preferences 最适合您,因为它“为简单数据提供持久存储。”

示例代码:

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

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      body: Center(
      child: RaisedButton(
        onPressed: _getAndSaveToken,
        child: Text('Get token'),
        ),
      ),
    ),
  ));
}

_getAndSaveToken() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  String token = await _getTokenFromHttp();
  await prefs.setInt('jwt', token);
}

Future<String> _getTokenFromHttp() async {
  // http code here
}
© www.soinside.com 2019 - 2024. All rights reserved.