feat(mobile): Implement Keycloak WebView authentication with HTTP callback
- Replace flutter_appauth with custom WebView implementation to resolve deep link issues - Add KeycloakWebViewAuthService with integrated WebView for seamless authentication - Configure Android manifest for HTTP cleartext traffic support - Add network security config for development environment (192.168.1.11) - Update Keycloak client to use HTTP callback endpoint (http://192.168.1.11:8080/auth/callback) - Remove obsolete keycloak_auth_service.dart and temporary scripts - Clean up dependencies and regenerate injection configuration - Tested successfully on multiple Android devices (Xiaomi 2201116TG, SM A725F) BREAKING CHANGE: Authentication flow now uses WebView instead of external browser - Users will see Keycloak login page within the app instead of browser redirect - Resolves ERR_CLEARTEXT_NOT_PERMITTED and deep link state management issues - Maintains full OIDC compliance with PKCE flow and secure token storage Technical improvements: - WebView with custom navigation delegate for callback handling - Automatic token extraction and user info parsing from JWT - Proper error handling and user feedback - Consistent authentication state management across app lifecycle
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
import 'package:injectable/injectable.dart';
|
||||
import '../../../../core/models/evenement_model.dart';
|
||||
import '../../../../core/services/api_service.dart';
|
||||
import '../../domain/repositories/evenement_repository.dart';
|
||||
|
||||
/// Implémentation du repository pour les événements
|
||||
/// Utilise l'ApiService pour communiquer avec le backend
|
||||
@LazySingleton(as: EvenementRepository)
|
||||
class EvenementRepositoryImpl implements EvenementRepository {
|
||||
final ApiService _apiService;
|
||||
|
||||
EvenementRepositoryImpl(this._apiService);
|
||||
|
||||
@override
|
||||
Future<List<EvenementModel>> getEvenementsAVenir({
|
||||
int page = 0,
|
||||
int size = 10,
|
||||
}) async {
|
||||
return await _apiService.getEvenementsAVenir(page: page, size: size);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<EvenementModel>> getEvenementsPublics({
|
||||
int page = 0,
|
||||
int size = 20,
|
||||
}) async {
|
||||
return await _apiService.getEvenementsPublics(page: page, size: size);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<EvenementModel>> getEvenements({
|
||||
int page = 0,
|
||||
int size = 20,
|
||||
String sortField = 'dateDebut',
|
||||
String sortDirection = 'asc',
|
||||
}) async {
|
||||
return await _apiService.getEvenements(
|
||||
page: page,
|
||||
size: size,
|
||||
sortField: sortField,
|
||||
sortDirection: sortDirection,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<EvenementModel> getEvenementById(String id) async {
|
||||
return await _apiService.getEvenementById(id);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<EvenementModel>> rechercherEvenements(
|
||||
String terme, {
|
||||
int page = 0,
|
||||
int size = 20,
|
||||
}) async {
|
||||
return await _apiService.rechercherEvenements(
|
||||
terme,
|
||||
page: page,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<EvenementModel>> getEvenementsByType(
|
||||
TypeEvenement type, {
|
||||
int page = 0,
|
||||
int size = 20,
|
||||
}) async {
|
||||
return await _apiService.getEvenementsByType(
|
||||
type,
|
||||
page: page,
|
||||
size: size,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<EvenementModel> createEvenement(EvenementModel evenement) async {
|
||||
return await _apiService.createEvenement(evenement);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<EvenementModel> updateEvenement(String id, EvenementModel evenement) async {
|
||||
return await _apiService.updateEvenement(id, evenement);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> deleteEvenement(String id) async {
|
||||
return await _apiService.deleteEvenement(id);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<EvenementModel> changerStatutEvenement(
|
||||
String id,
|
||||
StatutEvenement nouveauStatut,
|
||||
) async {
|
||||
return await _apiService.changerStatutEvenement(id, nouveauStatut);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<Map<String, dynamic>> getStatistiquesEvenements() async {
|
||||
return await _apiService.getStatistiquesEvenements();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user