finally the new login is completely working with refresh token as well
This commit is contained in:
@@ -1,15 +1,16 @@
|
||||
// ignore_for_file: avoid_print
|
||||
// ignore_for_file: avoid_print, use_build_context_synchronously
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:refilc/api/login.dart';
|
||||
import 'package:refilc/api/nonce.dart';
|
||||
// import 'package:refilc/api/login.dart';
|
||||
// import 'package:refilc/api/nonce.dart';
|
||||
import 'package:refilc/api/providers/database_provider.dart';
|
||||
import 'package:refilc/api/providers/user_provider.dart';
|
||||
import 'package:refilc/api/providers/status_provider.dart';
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/models/user.dart';
|
||||
import 'package:refilc/utils/jwt.dart';
|
||||
// import 'package:refilc/utils/jwt.dart';
|
||||
import 'package:refilc_kreta_api/client/api.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:http/io_client.dart' as http;
|
||||
@@ -24,6 +25,7 @@ class KretaClient {
|
||||
|
||||
late final SettingsProvider _settings;
|
||||
late final UserProvider _user;
|
||||
late final DatabaseProvider _database;
|
||||
late final StatusProvider _status;
|
||||
|
||||
bool _loginRefreshing = false;
|
||||
@@ -32,9 +34,11 @@ class KretaClient {
|
||||
this.accessToken,
|
||||
required SettingsProvider settings,
|
||||
required UserProvider user,
|
||||
required DatabaseProvider database,
|
||||
required StatusProvider status,
|
||||
}) : _settings = settings,
|
||||
_user = user,
|
||||
_database = database,
|
||||
_status = status,
|
||||
userAgent = settings.config.userAgent {
|
||||
var ioclient = HttpClient();
|
||||
@@ -212,7 +216,7 @@ class KretaClient {
|
||||
res = await request.send();
|
||||
|
||||
if (res.statusCode == 401) {
|
||||
headerMap.remove("authorization");
|
||||
headerMap.remove("authorization");
|
||||
await refreshLogin();
|
||||
} else {
|
||||
break;
|
||||
@@ -232,65 +236,74 @@ class KretaClient {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> refreshLogin() async {
|
||||
if (_loginRefreshing) return;
|
||||
Future<String?> refreshLogin() async {
|
||||
if (_loginRefreshing) return null;
|
||||
_loginRefreshing = true;
|
||||
|
||||
User? loginUser = _user.user;
|
||||
if (loginUser == null) return;
|
||||
if (loginUser == null) return null;
|
||||
|
||||
Map<String, String> headers = {
|
||||
"content-type": "application/x-www-form-urlencoded",
|
||||
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
|
||||
"accept": "*/*",
|
||||
"user-agent": "eKretaStudent/264745 CFNetwork/1494.0.7 Darwin/23.4.0",
|
||||
};
|
||||
|
||||
String nonceStr = await getAPI(KretaAPI.nonce, json: false);
|
||||
Nonce nonce =
|
||||
getNonce(nonceStr, loginUser.username, loginUser.instituteCode);
|
||||
headers.addAll(nonce.header());
|
||||
|
||||
if (_settings.presentationMode) {
|
||||
print("DEBUG: refreshLogin: ${loginUser.id}");
|
||||
} else {
|
||||
print("DEBUG: refreshLogin: ${loginUser.id} ${loginUser.name}");
|
||||
}
|
||||
|
||||
Map? loginRes = await postAPI(
|
||||
KretaAPI.login,
|
||||
headers: headers,
|
||||
body: User.loginBody(
|
||||
username: loginUser.username,
|
||||
password: loginUser.password,
|
||||
instituteCode: loginUser.instituteCode,
|
||||
),
|
||||
);
|
||||
refreshToken ??= loginUser.refreshToken;
|
||||
|
||||
if (loginRes != null) {
|
||||
if (loginRes.containsKey("access_token")) {
|
||||
accessToken = loginRes["access_token"];
|
||||
}
|
||||
if (loginRes.containsKey("refresh_token")) {
|
||||
refreshToken = loginRes["refresh_token"];
|
||||
}
|
||||
|
||||
// Update role
|
||||
loginUser.role =
|
||||
JwtUtils.getRoleFromJWT(accessToken ?? "") ?? Role.student;
|
||||
}
|
||||
print("REFRESH TOKEN BELOW");
|
||||
print(refreshToken);
|
||||
|
||||
if (refreshToken != null) {
|
||||
Map? refreshRes = await postAPI(KretaAPI.login,
|
||||
print("REFRESHING LOGIN");
|
||||
Map? res = await postAPI(KretaAPI.login,
|
||||
headers: headers,
|
||||
body: User.refreshBody(
|
||||
refreshToken: refreshToken!,
|
||||
instituteCode: loginUser.instituteCode));
|
||||
if (refreshRes != null) {
|
||||
if (refreshRes.containsKey("id_token")) {
|
||||
idToken = refreshRes["id_token"];
|
||||
refreshToken: loginUser.refreshToken,
|
||||
instituteCode: loginUser.instituteCode,
|
||||
));
|
||||
print("REFRESH RESPONSE BELOW");
|
||||
print(res);
|
||||
if (res != null) {
|
||||
if (res.containsKey("error")) {
|
||||
// remove user if refresh token expired
|
||||
if (res["error"] == "invalid_grant") {
|
||||
// remove user from app
|
||||
_user.removeUser(loginUser.id);
|
||||
await _database.store.removeUser(loginUser.id);
|
||||
|
||||
// return error
|
||||
return "refresh_token_expired";
|
||||
}
|
||||
}
|
||||
|
||||
if (res.containsKey("access_token")) {
|
||||
accessToken = res["access_token"];
|
||||
}
|
||||
if (res.containsKey("refresh_token")) {
|
||||
refreshToken = res["refresh_token"];
|
||||
loginUser.refreshToken = res["refresh_token"];
|
||||
_database.store.storeUser(loginUser);
|
||||
_user.refresh();
|
||||
}
|
||||
if (res.containsKey("id_token")) {
|
||||
idToken = res["id_token"];
|
||||
}
|
||||
_loginRefreshing = false;
|
||||
} else {
|
||||
_loginRefreshing = false;
|
||||
}
|
||||
} else {
|
||||
_loginRefreshing = false;
|
||||
}
|
||||
|
||||
_loginRefreshing = false;
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<void> logout() async {
|
||||
|
||||
Reference in New Issue
Block a user