HopSpotFrontend/lib/services/auth/auth_service.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();
}
}