L'authentification Keycloak WebView est maintenant 100% fonctionnelle avec navigation automatique vers le dashboard !
This commit is contained in:
@@ -64,11 +64,12 @@ class AuthUserProfileUpdated extends AuthEvent {
|
|||||||
/// Événement de callback WebView
|
/// Événement de callback WebView
|
||||||
class AuthWebViewCallback extends AuthEvent {
|
class AuthWebViewCallback extends AuthEvent {
|
||||||
final String callbackUrl;
|
final String callbackUrl;
|
||||||
|
final User? user;
|
||||||
|
|
||||||
const AuthWebViewCallback(this.callbackUrl);
|
const AuthWebViewCallback(this.callbackUrl, {this.user});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [callbackUrl];
|
List<Object?> get props => [callbackUrl, user];
|
||||||
}
|
}
|
||||||
|
|
||||||
// === ÉTATS ===
|
// === ÉTATS ===
|
||||||
@@ -254,10 +255,17 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
|||||||
try {
|
try {
|
||||||
debugPrint('🔄 Traitement callback WebView...');
|
debugPrint('🔄 Traitement callback WebView...');
|
||||||
|
|
||||||
// Traiter le callback et récupérer l'utilisateur
|
// Utiliser l'utilisateur fourni ou traiter le callback
|
||||||
final User user = await KeycloakAuthService.handleWebViewCallback(event.callbackUrl);
|
final User user;
|
||||||
|
if (event.user != null) {
|
||||||
|
debugPrint('👤 Utilisation des données utilisateur fournies: ${event.user!.fullName}');
|
||||||
|
user = event.user!;
|
||||||
|
} else {
|
||||||
|
debugPrint('🔄 Traitement du callback URL: ${event.callbackUrl}');
|
||||||
|
user = await KeycloakAuthService.handleWebViewCallback(event.callbackUrl);
|
||||||
|
}
|
||||||
|
|
||||||
debugPrint('👤 Utilisateur récupéré: ${user.fullName} (${user.primaryRole.displayName})');
|
debugPrint('👤 Utilisateur authentifié: ${user.fullName} (${user.primaryRole.displayName})');
|
||||||
|
|
||||||
// Calculer les permissions effectives
|
// Calculer les permissions effectives
|
||||||
debugPrint('🔐 Calcul des permissions effectives...');
|
debugPrint('🔐 Calcul des permissions effectives...');
|
||||||
@@ -278,7 +286,7 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
|
|||||||
accessToken: '', // Token géré par KeycloakWebViewAuthService
|
accessToken: '', // Token géré par KeycloakWebViewAuthService
|
||||||
));
|
));
|
||||||
|
|
||||||
debugPrint('🎉 Authentification complète réussie');
|
debugPrint('🎉 Authentification complète réussie - navigation vers dashboard');
|
||||||
|
|
||||||
} catch (e, stackTrace) {
|
} catch (e, stackTrace) {
|
||||||
debugPrint('💥 Erreur authentification: $e');
|
debugPrint('💥 Erreur authentification: $e');
|
||||||
|
|||||||
@@ -73,11 +73,16 @@ class _LoginPageState extends State<LoginPage>
|
|||||||
builder: (context) => KeycloakWebViewAuthPage(
|
builder: (context) => KeycloakWebViewAuthPage(
|
||||||
onAuthSuccess: (user) {
|
onAuthSuccess: (user) {
|
||||||
debugPrint('✅ Authentification réussie pour: ${user.fullName}');
|
debugPrint('✅ Authentification réussie pour: ${user.fullName}');
|
||||||
// Notifier le BLoC du succès
|
debugPrint('🔄 Notification du BLoC avec les données utilisateur...');
|
||||||
context.read<AuthBloc>().add(AuthWebViewCallback('success'));
|
|
||||||
// Fermer la WebView et naviguer vers le dashboard
|
// Notifier le BLoC du succès avec les données utilisateur
|
||||||
|
context.read<AuthBloc>().add(AuthWebViewCallback(
|
||||||
|
'success',
|
||||||
|
user: user,
|
||||||
|
));
|
||||||
|
|
||||||
|
// Fermer la WebView - la navigation sera gérée par le BlocListener
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
Navigator.of(context).pushReplacementNamed('/dashboard');
|
|
||||||
},
|
},
|
||||||
onAuthError: (error) {
|
onAuthError: (error) {
|
||||||
debugPrint('❌ Erreur d\'authentification: $error');
|
debugPrint('❌ Erreur d\'authentification: $error');
|
||||||
|
|||||||
@@ -117,11 +117,13 @@ class VisitorDashboard extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
const Icon(Icons.info_outline, color: Colors.white, size: 30),
|
const Icon(Icons.info_outline, color: Colors.white, size: 30),
|
||||||
const SizedBox(width: SpacingTokens.sm),
|
const SizedBox(width: SpacingTokens.sm),
|
||||||
Text(
|
Expanded(
|
||||||
'Découvrez notre communauté',
|
child: Text(
|
||||||
style: TypographyTokens.headlineMedium.copyWith(
|
'Découvrez notre communauté',
|
||||||
color: Colors.white,
|
style: TypographyTokens.headlineMedium.copyWith(
|
||||||
fontWeight: FontWeight.bold,
|
color: Colors.white,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -74,22 +74,29 @@ class UnionFlowApp extends StatelessWidget {
|
|||||||
GlobalCupertinoLocalizations.delegate,
|
GlobalCupertinoLocalizations.delegate,
|
||||||
],
|
],
|
||||||
|
|
||||||
// Page d'accueil avec authentification
|
// Configuration des routes
|
||||||
home: BlocBuilder<AuthBloc, AuthState>(
|
routes: {
|
||||||
builder: (context, state) {
|
'/': (context) => BlocBuilder<AuthBloc, AuthState>(
|
||||||
if (state is AuthLoading) {
|
builder: (context, state) {
|
||||||
return const Scaffold(
|
if (state is AuthLoading) {
|
||||||
body: Center(
|
return const Scaffold(
|
||||||
child: CircularProgressIndicator(),
|
body: Center(
|
||||||
),
|
child: CircularProgressIndicator(),
|
||||||
);
|
),
|
||||||
} else if (state is AuthAuthenticated) {
|
);
|
||||||
return const AdaptiveDashboardPage();
|
} else if (state is AuthAuthenticated) {
|
||||||
} else {
|
return const AdaptiveDashboardPage();
|
||||||
return const LoginPage();
|
} else {
|
||||||
}
|
return const LoginPage();
|
||||||
},
|
}
|
||||||
),
|
},
|
||||||
|
),
|
||||||
|
'/dashboard': (context) => const AdaptiveDashboardPage(),
|
||||||
|
'/login': (context) => const LoginPage(),
|
||||||
|
},
|
||||||
|
|
||||||
|
// Page d'accueil par défaut
|
||||||
|
initialRoute: '/',
|
||||||
|
|
||||||
// Builder global pour gérer les erreurs
|
// Builder global pour gérer les erreurs
|
||||||
builder: (context, child) {
|
builder: (context, child) {
|
||||||
|
|||||||
Reference in New Issue
Block a user