Persistência do estado do Authentication

Você pode especificar a persistência do estado do Authentication ao usar o SDK JS do Firebase. Isso inclui a possibilidade de especificar se um usuário conectado deve permanecer assim até sair da sessão ou se os dados dele devem ser apagados quando a janela for fechada ou quando a página for atualizada.

Para um aplicativo da Web, o comportamento padrão é manter a sessão de um usuário mesmo depois de fechar o navegador. Esse comportamento é vantajoso, já que o usuário não precisa fazer login todas as vezes que acessar a página da Web no mesmo dispositivo. Se o login fosse necessário, seria preciso reinserir a senha, enviar uma verificação por SMS etc., o que prejudicaria muito a experiência do usuário.

No entanto, esse comportamento não é indicado para os casos abaixo:

  • Aplicativos com dados confidenciais que precisem apagar o estado quando a janela ou a guia forem fechadas. Essa medida é importante caso o usuário esqueça de sair da sessão.
  • Aplicativos usados em um dispositivo compartilhado por vários usuários. Um exemplo comum é um app executado em um computador de biblioteca.
  • Um aplicativo em um dispositivo compartilhado que possa ser acessado por vários usuários. O desenvolvedor não consegue saber como esse aplicativo é acessado e pode fornecer ao usuário a possibilidade de escolher se quer que a sessão seja mantida. Para isso, é necessário ativar a opção "Lembrar meus dados" durante o login.
  • Em algumas situações, pode ser que um desenvolvedor não queira que o estado de um usuário anônimo seja mantido até que ele faça upgrade para uma conta não anônima (federada, senha, telefone etc.).
  • Alguns desenvolvedores podem querer permitir o login de diferentes usuários em guias distintas de um aplicativo. O comportamento padrão é manter o estado em todas as guias que tiverem a mesma origem.

Conforme mencionado acima, há várias situações em que a persistência padrão pode precisar ser modificada.

Tipos compatíveis de persistência do estado do Authentication

Você pode escolher um dos três tipos de persistência de estado do Authentication em uma instância especificada do Firebase Authentication com base nos requisitos do aplicativo ou do usuário.

Enum Valor Descrição
firebase.auth.Auth.Persistence.LOCAL "local" Indica que haverá persistência do estado mesmo depois que a janela do navegador for fechada ou que a atividade for destruída no React Native. Para apagar o estado, é necessário sair da sessão. Observe que as sessões da Web do Firebase Authentication vêm de um host e serão mantidas somente para um domínio.
firebase.auth.Auth.Persistence.SESSION "session" Indica que o estado será mantido somente na sessão ou guia atual e será apagado quando a guia ou janela em que o usuário fez a autenticação for fechada. É aplicável apenas para apps da Web.
firebase.auth.Auth.Persistence.NONE "none" Indica que o estado será armazenado apenas na memória e será apagado quando a janela ou atividade for atualizada.

Como modificar a persistência do estado do Auth

Chame o método firebase.auth().setPersistence para especificar ou modificar o tipo de persistência existente:

Web

import { getAuth, setPersistence, signInWithEmailAndPassword, browserSessionPersistence } from "firebase/auth";

const auth = getAuth();
setPersistence(auth, browserSessionPersistence)
  .then(() => {
    // Existing and future Auth states are now persisted in the current
    // session only. Closing the window would clear any existing state even
    // if a user forgets to sign out.
    // ...
    // New sign-in will be persisted with session persistence.
    return signInWithEmailAndPassword(auth, email, password);
  })
  .catch((error) => {
    // Handle Errors here.
    const errorCode = error.code;
    const errorMessage = error.message;
  });

Web

firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION)
  .then(() => {
    // Existing and future Auth states are now persisted in the current
    // session only. Closing the window would clear any existing state even
    // if a user forgets to sign out.
    // ...
    // New sign-in will be persisted with session persistence.
    return firebase.auth().signInWithEmailAndPassword(email, password);
  })
  .catch((error) => {
    // Handle Errors here.
    var errorCode = error.code;
    var errorMessage = error.message;
  });

Isso altera o tipo de persistência da instância especificada do Auth para a sessão do Auth salva atualmente e aplica esse tipo de persistência nas próximas solicitações de login, inclusive no login com solicitações de redirecionamento. Esse processo retorna uma promessa, que será resolvida assim que o estado for copiado de um tipo de armazenamento para o outro. Uma chamada de método de login feita depois de alterar a persistência espera que essa mudança seja concluída antes de aplicá-la no novo estado do Authentication.

O padrão para os apps de navegador da Web e que usam React Native é local, desde que o navegador seja compatível com este mecanismo de armazenamento, por exemplo, se os cookies/dados de terceiros estiverem ativados. Para os apps de back-end em Node.js, o padrão é none.

Visão geral do comportamento de persistência

Os critérios a seguir serão aplicados para determinar o estado atual de persistência.

  • Inicialmente, o SDK verificará se existe um usuário autenticado. A menos que setPersistence seja chamado, o tipo de persistência atual desse usuário será aplicado nas próximas tentativas de login. Dessa forma, se o usuário continuar na session em uma página da Web anterior e visitar uma nova página, o login com um perfil diferente fará com que o estado dele também seja salvo com a persistência de session.
  • Se nenhum usuário estiver conectado e nenhuma persistência for especificada, a configuração padrão será aplicada (local no app do navegador).
  • Se nenhum usuário estiver conectado e um novo tipo de persistência for configurado, ela será usada por qualquer nova tentativa de login.
  • Se o usuário estiver conectado e o tipo de persistência for modificado, ela será alterada para o usuário conectado existente. As próximas tentativas de login usarão essa nova persistência.
  • Quando signInWithRedirect é chamado, o tipo de persistência atual é mantido e aplicado no final do fluxo do OAuth para o usuário recém-conectado, mesmo que a persistência seja none. Se a persistência for especificada explicitamente nessa página, ela modificará a persistência do estado de autenticação da página anterior que iniciou o fluxo de redirecionamento.

    Web

    import { getAuth, setPersistence, signInWithRedirect, inMemoryPersistence, GoogleAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    setPersistence(auth, inMemoryPersistence)
      .then(() => {
        const provider = new GoogleAuthProvider();
        // In memory persistence will be applied to the signed in Google user
        // even though the persistence was set to 'none' and a page redirect
        // occurred.
        return signInWithRedirect(auth, provider);
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
      });

    Web

    firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE)
      .then(() => {
        var provider = new firebase.auth.GoogleAuthProvider();
        // In memory persistence will be applied to the signed in Google user
        // even though the persistence was set to 'none' and a page redirect
        // occurred.
        return firebase.auth().signInWithRedirect(provider);
      })
      .catch((error) => {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
      });

Comportamento esperado nas guias do navegador

O comportamento esperado a seguir será aplicável quando diferentes tipos de persistência forem usados em guias distintas. O requisito é que nunca deve haver vários tipos de estado salvos ao mesmo tempo (por exemplo, estado de autenticação salvo nos tipos de armazenamento session e local):

  • Os usuários podem fazer login usando a persistência session ou none com usuários diferentes em várias guias. Uma guia não pode ver o estado da outra.
  • Qualquer tentativa de fazer login usando a persistência local será detectada e sincronizada em todas as guias. Se o usuário tiver feito login anteriormente em uma guia específica usando a persistência session ou none, esse estado será apagado.
  • Caso o usuário tenha feito login anteriormente usando a persistência local com várias guias abertas e, em seguida, tenha mudado para a persistência none ou session em uma guia, o estado será modificado e haverá persistência do usuário em session ou none. Em todas as outras guias, o usuário será desconectado.