✨ Dispose current session when logout
This commit is contained in:
@ -1,3 +1,5 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
@ -35,6 +37,32 @@ class UserProvider extends ChangeNotifier {
|
||||
});
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>?> get atkClaims async {
|
||||
final tk = (await atk);
|
||||
if (tk == null) return null;
|
||||
final atkParts = tk.split('.');
|
||||
if (atkParts.length != 3) {
|
||||
throw Exception('invalid format of access token');
|
||||
}
|
||||
|
||||
var rawPayload = atkParts[1].replaceAll('-', '+').replaceAll('_', '/');
|
||||
switch (rawPayload.length % 4) {
|
||||
case 0:
|
||||
break;
|
||||
case 2:
|
||||
rawPayload += '==';
|
||||
break;
|
||||
case 3:
|
||||
rawPayload += '=';
|
||||
break;
|
||||
default:
|
||||
throw Exception('illegal format of access token payload');
|
||||
}
|
||||
|
||||
final b64 = utf8.fuse(base64Url);
|
||||
return jsonDecode(b64.decode(rawPayload));
|
||||
}
|
||||
|
||||
Future<SnAccount?> refreshUser() async {
|
||||
final resp = await _sn.client.get('/cgi/id/users/me');
|
||||
final out = SnAccount.fromJson(resp.data);
|
||||
@ -47,7 +75,13 @@ class UserProvider extends ChangeNotifier {
|
||||
}
|
||||
|
||||
void logoutUser() async {
|
||||
_sn.clearTokenPair();
|
||||
atkClaims.then((value) async {
|
||||
if (value != null) {
|
||||
await _sn.client.delete('/cgi/id/users/me/tickets/${value['sed']}');
|
||||
logging.info('[Auth] Current session has been destroyed.');
|
||||
}
|
||||
_sn.clearTokenPair();
|
||||
});
|
||||
isAuthorized = false;
|
||||
user = null;
|
||||
notifyListeners();
|
||||
|
Reference in New Issue
Block a user