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:
@@ -6,6 +6,7 @@ import '../../../../shared/widgets/buttons/buttons.dart';
|
||||
import '../../../dashboard/presentation/pages/dashboard_page.dart';
|
||||
import '../../../members/presentation/pages/membres_list_page.dart';
|
||||
import '../../../cotisations/presentation/pages/cotisations_list_page.dart';
|
||||
import '../../../evenements/presentation/pages/evenements_page.dart';
|
||||
import '../widgets/custom_bottom_nav_bar.dart';
|
||||
|
||||
class MainNavigation extends StatefulWidget {
|
||||
@@ -105,7 +106,8 @@ class _MainNavigationState extends State<MainNavigation>
|
||||
|
||||
Widget _buildFloatingActionButton() {
|
||||
// Afficher le FAB seulement sur certains onglets
|
||||
if (_currentIndex == 1 || _currentIndex == 2 || _currentIndex == 3) {
|
||||
// IMPORTANT: L'onglet Membres (index 1) a son propre FAB, donc on ne l'affiche pas ici
|
||||
if (_currentIndex == 2 || _currentIndex == 3) {
|
||||
return ScaleTransition(
|
||||
scale: _fabAnimation,
|
||||
child: QuickButtons.fab(
|
||||
@@ -212,20 +214,7 @@ class _MainNavigationState extends State<MainNavigation>
|
||||
}
|
||||
|
||||
Widget _buildEventsPage() {
|
||||
return const ComingSoonPage(
|
||||
title: 'Module Événements',
|
||||
description: 'Organisation et gestion d\'événements avec calendrier intégré',
|
||||
icon: Icons.event_rounded,
|
||||
color: AppTheme.warningColor,
|
||||
features: [
|
||||
'Calendrier interactif des événements',
|
||||
'Gestion des inscriptions en ligne',
|
||||
'Envoi d\'invitations automatiques',
|
||||
'Suivi de la participation',
|
||||
'Gestion des lieux et ressources',
|
||||
'Sondages et feedback post-événement',
|
||||
],
|
||||
);
|
||||
return const EvenementsPage();
|
||||
}
|
||||
|
||||
Widget _buildMorePage() {
|
||||
|
||||
Reference in New Issue
Block a user