如何缓存授权数据(access_token)?



我有macOS应用程序,我想在用户登录或注册时缓存数据。我有access_token和refresh_token

当用户再次启动Mac OS应用程序时,我想让用户不会再次登录,并立即转移到MainWidget()

对于存储access_token和refresh_token,我使用shared_preferences

这是我的首选项:

class PreferencesProvider {
static PreferencesProvider? _instance;
SharedPreferences? _preferences;
factory PreferencesProvider() {
_instance ??= PreferencesProvider._();
return _instance!;
}
PreferencesProvider._() {
_initPreferences();
}
Future<void> _initPreferences() async {
_preferences = await SharedPreferences.getInstance();
}
Future<void> setAccess(String value) async {
await _initPreferences();
await _preferences!.setString("ACCESS_TOKEN", value);
}

Future<String?> getAccess() async {
await _initPreferences();
return _preferences!.getString("ACCESS_TOKEN");
}
Future<void> clearAccess() async {
await _initPreferences();
await _preferences!.remove("ACCESS_TOKEN");
}
Future<void> setRefresh(String value) async {
await _initPreferences();
await _preferences!.setString("REFRESH_TOKEN", value);
}
Future<String?> getRefresh() async {
await _initPreferences();
return _preferences!.getString("REFRESH_TOKEN");
}
}

当我登录或注册(如果授权成功)时,这是我的授权位:

if (data['success']) {
await _preference.clearAccess();
PreferencesProvider()
..setUserId(data['userId'])
..setAccess(data['accessToken'])
..setRefresh(data['refreshToken']);
_apiProvider.setToken(data["accessToken"]);
}

这是我在主应用程序中显示的:home: const StartScreen(),

当我启动我的Mac OS应用程序,如果我登录然后我想显示home: MainWidget()

作为你的MaterialApp的home:,总是分配一个中间屏幕[无论你是否登录],在这个屏幕中,我们将检查用户是否登录并将他重定向到各自的屏幕。假设中间屏幕是SplashScreen,它看起来像这样:

class SplashScreen extends StatefulWidget {
const SplashScreen({Key? key}) : super(key: key);
@override
State<SplashScreen> createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
Future<bool> _checkLoginStatus() async {
try {
//check whether we have access and refresh tokens here (maybe also perform
// a network request to check if the tokens are still valid) and
// based on that, return true or false
} catch (e) {
return false;
}
}
@override
void initState() {
_checkLoginStatus().then((value) {
if (value == true) {
//navigate the user to MainWidget()
} else {
//navigate the user to StartScreen()
}
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(child: CircularProgressIndicator()),
);
}
}

PS:如果你打算在本地保存你的令牌,考虑使用像flutter_secure_storage或hive这样的包,这样你就可以在保存时加密你的数据。

相关内容

最新更新