Flutter 中每个 API 请求都可以访问安全存储吗?

Tau*_*ri 5 dart flutter

在我的 flutter 应用程序中,我使用 flutter_secure_storage 存储 JWT。我需要在每个 API 请求中发送令牌。

问题 1如果我像下面这样访问 flutter_secure_storage 每个 API 请求,是否有任何性能或安全问题?我担心等待访问 flutter_secure_storage。

Future<http.Response> getRequest(String url) async {
  String token = await FlutterSecureStorage().read(key: 'token');
  return await http.get(url, headers: {'token': token});
}
Run Code Online (Sandbox Code Playgroud)

问题 2创建一个具有如下标记的单例类是一种好方法吗?在代码中,我不会在每个 API 请求中访问 flutter_secure_storage。所以我认为性能有所提高。

// singleton class which has token.
class Auth {
  final String _token;

  String get token => _token;

  static Auth _instance;

  factory Auth() => _instance;

  Auth._init(this._token);

  static Future<void> create() async {
    String token = await FlutterSecureStorage().read(key: 'token');
    _instance = Auth._init(token);
  }
}

// initialize singleton class in main
void main() async {
  await Auth.create();
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)
// able to get the token anywhere without await
Future<http.Response> getRequest(String url) async {
  String token = Auth().token;
  return await http.get(url, headers: {'token': token});
}
Run Code Online (Sandbox Code Playgroud)

请告诉我最好的方法。

Tay*_*rmi 5

我认为最好的方法是像我在这里所做的那样创建一个安全存储单例 SharedPreferences

    import 'package:shared_preferences/shared_preferences.dart';
class StorageUtil {
  static StorageUtil _storageUtil;
  static SharedPreferences _preferences;

  static Future<StorageUtil> getInstance() async {
    if (_storageUtil == null) {
      // keep local instance till it is fully initialized.
      var secureStorage = StorageUtil._();
      await secureStorage._init();
      _storageUtil = secureStorage;
    }
    return _storageUtil;
  }
  StorageUtil._();
  Future _init() async {
    _preferences = await SharedPreferences.getInstance();
  }
  // get string
  static String getString(String key, {String defValue = ''}) {
    if (_preferences == null) return defValue;
    return _preferences.getString(key) ?? defValue;
  }
  // put string
  static Future<bool> putString(String key, String value) {
    if (_preferences == null) return null;
    return _preferences.setString(key, value);
  }

}
Run Code Online (Sandbox Code Playgroud)

您需要在主文件中调用实例。

void main() async {    
  await StorageUtil.getInstance();
}
Run Code Online (Sandbox Code Playgroud)

您将能够在任何地方获得令牌

StorageUtil.getString("token");
Run Code Online (Sandbox Code Playgroud)