79 lines
2.9 KiB
Dart
79 lines
2.9 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
|
import 'package:http/http.dart' as http;
|
|
|
|
class AuthService {
|
|
final _storage = const FlutterSecureStorage();
|
|
final String? backendUrl = 'https://group-1-15.pvt.dsv.su.se';
|
|
final String refreshTokenEndpoint = '/api/auth/refresh';
|
|
|
|
Future<void> saveTokens(String accessToken, String refreshToken) async {
|
|
await _storage.write(key: 'accessToken', value: accessToken);
|
|
await _storage.write(key: 'refreshToken', value: refreshToken);
|
|
}
|
|
|
|
Future<String?> getAccessToken() async {
|
|
return await _storage.read(key: 'accessToken');
|
|
}
|
|
|
|
Future<String?> getRefreshToken() async {
|
|
return await _storage.read(key: 'refreshToken');
|
|
}
|
|
|
|
Future<Map<String, String>?> refreshAccessToken() async {
|
|
final refreshToken = await getRefreshToken();
|
|
|
|
if (refreshToken == null || backendUrl == null) {
|
|
print('Inget refresh-token eller backend-URL tillgängligt för token-förnyelse.');
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
final response = await http.post(
|
|
Uri.parse('http://10.0.2.2:8080/api/auth/refresh'),
|
|
headers: {'Content-Type': 'application/json'},
|
|
body: json.encode({'refreshToken': refreshToken}),
|
|
);
|
|
|
|
if (response.statusCode == 200) {
|
|
final Map<String, dynamic> responseData = json.decode(response.body);
|
|
final newAccessToken = responseData['accessToken'] as String?;
|
|
final newRefreshToken = responseData['refreshToken'] as String?; // backend skickar inte refreshtoken i nuläget, kanske ändras i framtiden beroende på hur vi vill att det ska vara
|
|
|
|
if (newAccessToken != null) {
|
|
await saveTokens(newAccessToken, newRefreshToken ?? refreshToken);
|
|
return {'accessToken': newAccessToken, 'refreshToken': newRefreshToken ?? refreshToken};
|
|
} else {
|
|
print('Backend returnerade inget nytt access-token vid förnyelse.');
|
|
return null;
|
|
}
|
|
} else {
|
|
print('Fel vid token-förnyelse: ${response.statusCode}');
|
|
await deleteTokens(); // Om förnyelse misslyckas, kan refresh-token vara ogiltigt
|
|
return null;
|
|
}
|
|
} catch (e) {
|
|
print('Fel vid anrop till token-förnyelse endpoint: $e');
|
|
deleteTokens(); // Vid nätverksfel eller andra problem, logga ut
|
|
return null;
|
|
}
|
|
}
|
|
|
|
Future<void> deleteTokens() async {
|
|
await _storage.delete(key: 'accessToken');
|
|
await _storage.delete(key: 'refreshToken');
|
|
}
|
|
|
|
// Valfritt: Metod för att kontrollera om tokens finns
|
|
Future<bool> hasTokens() async {
|
|
final accessToken = await getAccessToken();
|
|
final refreshToken = await getRefreshToken();
|
|
return accessToken != null && refreshToken != null;
|
|
}
|
|
|
|
// Valfritt: Metod för att hämta alla tokens (för felsökning)
|
|
Future<Map<String, String>> getAllTokens() async {
|
|
return await _storage.readAll();
|
|
}
|
|
} |