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

时间:2019-03-07 03:27:05

标签: sqlite flutter jwt token

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

3 个答案:

答案 0 :(得分:9)

正如我在已删除帖子中提到的那样,我一直在使用配置单元来存储我的令牌和其他本地数据。使用hive,可以创建an encrypted box

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应该是您更好的选择。

答案 1 :(得分:2)

使用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
}

答案 2 :(得分:0)

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