🐛 Fix refresh token

This commit is contained in:
2024-11-09 19:32:21 +08:00
parent 4d12d243b3
commit a629f5e12c
6 changed files with 177 additions and 40 deletions

View File

@ -4,12 +4,11 @@ import 'package:surface/providers/sn_network.dart';
import 'package:surface/types/attachment.dart';
class SnAttachmentProvider {
late final SnNetworkProvider sn;
late final SnNetworkProvider _sn;
final Map<String, SnAttachment> _cache = {};
SnAttachmentProvider(BuildContext context) {
sn = context.read<SnNetworkProvider>();
_sn = context.read<SnNetworkProvider>();
}
Future<SnAttachment> getOne(String rid, {noCache = false}) async {
@ -17,7 +16,7 @@ class SnAttachmentProvider {
return _cache[rid]!;
}
final resp = await sn.client.get('/cgi/uc/attachments/$rid/meta');
final resp = await _sn.client.get('/cgi/uc/attachments/$rid/meta');
final out = SnAttachment.fromJson(resp.data);
_cache[rid] = out;
@ -33,7 +32,7 @@ class SnAttachmentProvider {
return rids.map((rid) => _cache[rid]!).toList();
}
final resp = await sn.client.get('/cgi/uc/attachments', queryParameters: {
final resp = await _sn.client.get('/cgi/uc/attachments', queryParameters: {
'take': pendingFetch.length,
'id': pendingFetch.join(','),
});

View File

@ -67,7 +67,7 @@ class SnNetworkProvider {
final b64 = utf8.fuse(base64Url);
final payload = b64.decode(rawPayload);
final exp = jsonDecode(payload)['exp'];
if (exp >= DateTime.now().millisecondsSinceEpoch) {
if (exp <= DateTime.now().millisecondsSinceEpoch ~/ 1000) {
log('Access token need refresh, doing it at ${DateTime.now()}');
atk = await refreshToken();
}
@ -78,6 +78,8 @@ class SnNetworkProvider {
log('Access token refresh failed...');
}
}
} catch (err) {
log('Failed to authenticate user: $err');
} finally {
handler.next(options);
}
@ -114,7 +116,12 @@ class SnNetworkProvider {
final rtk = await _storage.read(key: kRtkStoreKey);
if (rtk == null) return null;
final resp = await client.post('/cgi/id/auth/token', data: {
final dio = Dio();
dio.options.baseUrl = kUseLocalNetwork
? 'http://localhost:8001'
: 'https://api.sn.solsynth.dev';
final resp = await dio.post('/cgi/id/auth/token', data: {
'grant_type': 'refresh_token',
'refresh_token': rtk,
});

View File

@ -10,12 +10,11 @@ class UserProvider extends ChangeNotifier {
bool isAuthorized = false;
SnAccount? user;
late final SnNetworkProvider sn;
late final SnNetworkProvider _sn;
late final FlutterSecureStorage _storage = FlutterSecureStorage();
UserProvider(BuildContext context) {
sn = context.read<SnNetworkProvider>();
_sn = context.read<SnNetworkProvider>();
_storage.read(key: kAtkStoreKey).then((value) {
isAuthorized = value != null;
@ -31,7 +30,7 @@ class UserProvider extends ChangeNotifier {
Future<SnAccount?> refreshUser() async {
if (!isAuthorized) return null;
final resp = await sn.client.get('/cgi/id/users/me');
final resp = await _sn.client.get('/cgi/id/users/me');
final out = SnAccount.fromJson(resp.data);
user = out;
@ -39,4 +38,11 @@ class UserProvider extends ChangeNotifier {
return out;
}
void logoutUser() async {
_sn.clearTokenPair();
isAuthorized = false;
user = null;
notifyListeners();
}
}