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 saveTokens(String accessToken, String refreshToken) async { await _storage.write(key: 'accessToken', value: accessToken); await _storage.write(key: 'refreshToken', value: refreshToken); } Future getAccessToken() async { return await _storage.read(key: 'accessToken'); } Future getRefreshToken() async { return await _storage.read(key: 'refreshToken'); } Future?> 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 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 deleteTokens() async { await _storage.delete(key: 'accessToken'); await _storage.delete(key: 'refreshToken'); } // Valfritt: Metod för att kontrollera om tokens finns Future 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> getAllTokens() async { return await _storage.readAll(); } }