Flutter Firebase Auth - Abgefangenes abgelaufenes Token
Ich verwende das Firebase Auth-Plugin zur Authentifizierung meiner Flutter-App.
Bis zum Upgrade (nicht sicher, ob relevant) auf die neueste Firebase-Authentifizierungsversion:
firebase_core: ^0.5.0
firebase_auth: ^0.18.0+1
alles hat gut funktioniert.
Jetzt habe ich zum ersten Mal einen Sentry-Fehler erhalten:
FirebaseAuthException: [firebase_auth/user-token-expired] The user's credential is no longer valid. The user must sign in again.
File "exception.dart", line 20, in catchPlatformException
File "zone.dart", line 1198, in _rootRunUnary
File "zone.dart", line 1100, in _CustomZone.runUnary
File "future_impl.dart", line 160, in _FutureListener.handleError
File "future_impl.dart", line 708, in Future._propagateToListeners.handleError
File "future_impl.dart", line 729, in Future._propagateToListeners
File "future_impl.dart", line 537, in Future._completeError
File "async_patch.dart", line 47, in _AsyncAwaitCompleter.completeError
File "platform_channel.dart", in MethodChannel.invokeMapMethod
File "<asynchronous suspension>"
File "unparsed"
Wie kann das passieren? Der Benutzer sagte, dass er diese App einige Tage lang nicht benutzt habe. Soweit ich die Dokumentation zur Firebase-Authentifizierung verstehe, wird das Authentifizierungstoken automatisch mit dem Aktualisierungstoken aktualisiert.
Wie kann ich dieses Problem beheben?
Wo / wie kann ich diese Ausnahme abfangen, um einen Benutzer zum Anmeldebildschirm umzuleiten?
Antworten
Sie können ein paar Dinge tun,
Erstens :
Wenn ein Benutzer Ihre App startet, sollten Sie zuerst prüfen, ob der Benutzer bereits angemeldet ist oder nicht. Wenn dies der Fall ist, melden Sie sich stillschweigend an. Wenn nicht, senden Sie den Benutzer zur Anmeldeseite. Unten sehen Sie ein Beispiel für eine App I. Build vor vier Monaten (Sie müssen Ihrer App die Abhängigkeit google_sign_in hinzufügen )
class _StartingPageState extends State<StartingPage> {
Future<dynamic> decideStartingPage() async {
bool isUserSignedIn = await googleSignIn.isSignedIn();
if (isUserSignedIn == true) {
FirebaseUser futurefbuser =await getCurrentFirebaseUser();
assignFireBaseUser(futurefbuser);
await googleSignIn.signInSilently();
return HomeTabView();
}
else
return LoginPage();
}
Future<dynamic> startingpage;
@override
void initState(){
super.initState();
startingpage=decideStartingPage();
FirebaseAdMob.instance.initialize(appId: "ca-app-pub-...........");
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future:startingpage,
builder: (BuildContext ctx, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Center( child : const CircularProgressIndicator());
}
else
return snapshot.data;
}
);
}
}
Zweite:
Das zweite, was Sie tun können, ist, das Zugriffstoken und (oder) Aktualisierungstoken zu speichern, die Sie erhalten, wenn sich ein Benutzer anmeldet. Wenn dies abläuft, können Sie mithilfe des Aktualisierungstokens ein anderes Zugriffstoken erhalten. Dies bedeutet ein wenig zusätzliche Arbeit für Sie, da Sie das Token in freigegebenen Einstellungen oder in einer JSON-Datei speichern müssen.
Wo soll nun der Code für das obige Verfahren hinzugefügt werden? Sie müssen das erste identifizieren, was nur ein authentifizierter Benutzer tun kann, um in die Datenbank zu schreiben. Es ist durchaus möglich, dass Ihre App eine Ausnahme auslöst, da der Benutzer für diesen Vorgang nicht authentifiziert ist. Mit try, catch und schließlich können Sie den Benutzer erneut anmelden, ohne dass der Benutzer etwas tun muss. Für weitere Informationen besuchen Sie diese
Im ersten Fall müsste sich der Benutzer explizit erneut anmelden. Die zweite Methode erfordert zusätzliche Arbeit für Sie, ist jedoch für den Benutzer bequemer. Du hast die Wahl .