Flutter Firebase Auth - capturando token expirado

Sep 18 2020

Estou usando o plugin Firebase Auth para autenticação do meu aplicativo Flutter.

Até o upgrade (não tenho certeza se relevante) para a versão mais recente do Firebase auth:

firebase_core: ^0.5.0
firebase_auth: ^0.18.0+1

tudo funcionou bem.

Agora eu recebo, pela primeira vez, o erro de Sentinela:

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"

Como isso pode acontecer? O usuário disse que não usou este aplicativo por alguns dias. Pelo que entendi a documentação do Firebase Authentication, o token de autenticação é atualizado automaticamente com o token de atualização.

Como posso atenuar esse problema?

Onde / como posso capturar essa exceção para redirecionar um usuário para a tela de login?

Respostas

1 AnuragTripathi Sep 18 2020 at 14:47

Você pode fazer algumas coisas,

Primeiro :

quando um usuário inicia seu aplicativo, você deve verificar primeiro se o usuário já está conectado ou não, se ele estiver, em seguida, faça o login silenciosamente, se não, envie o usuário para a página de login compilar quatro meses atrás (você terá que adicionar dependência google_sign_in ao seu aplicativo)

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;
      }
    );
  }
}

Segundo:

A segunda coisa que você pode fazer é salvar o token de acesso e (ou) o token de atualização que você obtém quando um usuário faz login. Quando isso expirar, você pode obter um outro token de acesso usando o token de atualização. Isso significa um pouco de trabalho extra para você, pois você terá que salvar o token nas preferências compartilhadas ou em um arquivo json.

Agora, onde adicionar o código para lidar com o procedimento acima? Você deve identificar a primeira coisa que apenas um usuário autenticado pode fazer, como gravar no banco de dados. É bem possível que seu aplicativo esteja lançando uma exceção porque o usuário não está autenticado para essa operação. Usando try, catch e, finalmente, você pode conectar o usuário novamente sem precisar que ele faça nada. para mais informações visite este

No primeiro caso, o usuário precisaria entrar explicitamente novamente, o segundo método requer trabalho extra para você, mas é mais conveniente para o usuário. A escolha é sua .