在我的 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)
请告诉我最好的方法。
我认为最好的方法是像我在这里所做的那样创建一个安全存储单例 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)
归档时间: |
|
查看次数: |
1488 次 |
最近记录: |