Phase B: Token-Provider und AuthBloc robust gegen Storage-Plugin-Fehler

Beobachtung: Nach 'flutter_secure_storage' frisch dazugepackt ohne
Cold-Restart kam eine MissingPluginException auf dem AuthBloc-Stream
durch (read auf channel plugins.it_nomads.com/flutter_secure_storage)
und hat den ganzen Bloc-Event-Loop mitgerissen.

Fix:
- KeycloakOidcTokenProvider.restoreSession / _persistRefreshToken /
  logout fangen Plugin-Exceptions ab und loggen sie über debugPrint,
  statt sie hochzureichen. Restore-Pfad endet sauber mit 'kein Restore
  möglich', Login-Pfad hält den Token in Memory weiter.
- AuthBloc._handleRestore mit eigener try/catch als zweite Schutzschicht
  für jeden anderen Fehler aus dem Provider.

Bestehender Cold-Restart-Workaround (App stoppen + flutter run) für die
ursprüngliche MissingPluginException bleibt natürlich nötig — diese
Änderung sorgt nur dafür, dass künftige Storage-Probleme (Keychain
zerschossen, Restore-Backup, …) nicht die Auth komplett killen.
This commit is contained in:
Dennis Nemec
2026-05-14 23:04:12 +02:00
parent 6d7e58fc0f
commit 08824290ff
2 changed files with 36 additions and 7 deletions

View File

@ -74,10 +74,15 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
RestoreSessionRequested event,
Emitter<AuthState> emit,
) async {
final restored = await tokenProvider.restoreSession();
if (!restored) {
// Kein gültiger Token → bleibt bei Unauthenticated, kein Snackbar
// (das ist der normale Cold-Start-Pfad).
try {
await tokenProvider.restoreSession();
// Erfolg landet via Stream als ProviderSessionChanged.loggedIn.
// Misserfolg: bleibt bei Unauthenticated — kein Snackbar, das
// ist der normale Cold-Start-Pfad.
} catch (err, st) {
debugPrint('Restore-Session fehlgeschlagen: $err\n$st');
// State unverändert (Unauthenticated). Kein Snackbar — das
// wäre für den Cold-Start zu viel Lärm.
}
}