不仅仅是保存令牌的位置(例如:SQLite、Hive...),还有如何保存(库、最佳实践)?
您可能不想在共享首选项中存储敏感数据。相反,您可能想研究这样的插件: 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);
正如我在已删除的帖子中提到的,我一直在使用 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_secure_storage 应该是您更好的选择。hive
我使用 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
)sudo gem install cocoapods
sudo gem install cocoapods
使用 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
}