aves_mio/lib/remote/auth_client.dart
Fabio Micheluz 452c378178
Some checks are pending
Quality check / Flutter analysis (push) Waiting to run
Quality check / CodeQL analysis (java-kotlin) (push) Waiting to run
f1
2026-02-28 13:42:46 +01:00

61 lines
1.6 KiB
Dart

// lib/remote/auth_client.dart
import 'dart:convert';
import 'package:http/http.dart' as http;
class RemoteAuth {
final Uri base;
final String email;
final String password;
String? _token;
RemoteAuth({
required String baseUrl,
required this.email,
required this.password,
}) : base = Uri.parse(baseUrl.endsWith('/') ? baseUrl : '$baseUrl/');
Uri get _loginUri => base.resolve('auth/login');
/// Esegue il login e memorizza il token
Future<String> login() async {
print('POST URL: $_loginUri');
print('Body: ${json.encode({'email': email, 'password': password})}');
final res = await http.post(
_loginUri,
headers: {'Content-Type': 'application/json'},
body: json.encode({'email': email, 'password': password}),
).timeout(const Duration(seconds: 20));
print('Status: ${res.statusCode}');
print('Response: ${utf8.decode(res.bodyBytes)}');
if (res.statusCode != 200) {
throw Exception('Login fallito: HTTP ${res.statusCode} ${res.reasonPhrase}');
}
final map = json.decode(utf8.decode(res.bodyBytes)) as Map<String, dynamic>;
final token = map['token'] as String?;
if (token == null || token.isEmpty) {
throw Exception('Login fallito: token assente nella risposta');
}
_token = token;
return token;
}
/// Ritorna gli headers con Bearer, lanciando il login se necessario
Future<Map<String, String>> authHeaders() async {
_token ??= await login();
return {'Authorization': 'Bearer $_token'};
}
/// Invalida il token (es. dopo 401) e riesegue il login
Future<Map<String, String>> refreshAndHeaders() async {
_token = null;
return await authHeaders();
}
}