Autenticar com o Firebase usando contas baseadas em senhas no Android

Use Firebase Authentication para permitir que os usuários se autentiquem com o Firebase usando os próprios endereços de e-mail e senhas e para gerenciar as contas baseadas em senha do seu app.

Antes de começar

  1. Adicione o Firebase ao projeto para Android, caso ainda não tenha feito isso.

  2. Se você ainda não conectou o app ao projeto do Firebase, faça isso no console do Firebase.
  3. Ative o login com e-mail/senha:
    1. No console do Firebase, abra a seção Autenticação.
    2. Na guia Método de login, ative o login por E-mail/Senha e clique em Salvar.
  4. No arquivo Gradle do módulo (nível do app) (geralmente <project>/<app-module>/build.gradle.kts ou <project>/<app-module>/build.gradle), adicione a dependência da biblioteca do Firebase Authentication para Android. Recomendamos o uso do Firebase Android BoM para lidar com o controle de versões da biblioteca.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.6.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }
    

    Com o Firebase Android BoM, seu app sempre vai usar versões compatíveis das bibliotecas do Firebase para Android.

    (Alternativa) Adicionar dependências das bibliotecas do Firebase sem usar o BoM

    Se você preferir não usar o Firebase BoM, especifique cada versão das bibliotecas do Firebase na linha de dependência correspondente.

    Se você usa várias bibliotecas do Firebase no app, recomendamos utilizar o BoM para gerenciar as versões delas, porque isso ajuda a garantir a compatibilidade de todas as bibliotecas.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.1.0")
    }
    
    Está procurando um módulo de biblioteca específico do Kotlin? A partir de outubro de 2023 (Firebase BoM 32.5.0), os desenvolvedores Kotlin e Java poderão depender do módulo da biblioteca principal. Para mais detalhes, consulte Perguntas frequentes sobre essa iniciativa).

Criar uma conta baseada em senha

Para criar uma nova conta de usuário com uma senha, conclua estas etapas na atividade de inscrição do seu aplicativo:

  1. No método onCreate da sua atividade de inscrição, acesse a instância compartilhada do objeto FirebaseAuth:

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. Ao inicializar sua atividade, verifique se o usuário está conectado no momento:

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. Quando um novo usuário se inscrever usando o formulário do app, conclua as etapas de validação de nova conta exigidas, como verificar se a senha foi digitada corretamente e atende aos requisitos de complexidade.
  4. Crie uma conta enviando o endereço de e-mail e a senha do novo usuário para createUserWithEmailAndPassword:

    Kotlin+KTX

    auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "createUserWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "createUserWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "createUserWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "createUserWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    Se uma nova conta foi criada, isso significa que o usuário fez login. No retorno de chamada, use o método getCurrentUser para coletar os dados da conta do usuário.

Conectar um usuário com endereço de e-mail e senha

As etapas para um usuário fazer login com uma senha são semelhantes às de criação de uma nova conta. Na atividade de login do app, faça o seguinte:

  1. No método onCreate da atividade de login, acesse a instância compartilhada do objeto FirebaseAuth:

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. Ao inicializar sua atividade, verifique se o usuário está conectado no momento:

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. Quando um usuário fizer login no app, transmita o endereço de e-mail e a senha dele para signInWithEmailAndPassword:

    Kotlin+KTX

    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "signInWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    Se o login tiver ocorrido com sucesso, será possível continuar com o FirebaseUser.

Recomendado: definir uma política de senha

É possível melhorar a segurança da conta aplicando requisitos de complexidade de senha.

Para configurar uma política de senha para seu projeto, abra a guia Política de senha na página "Configurações de autenticação" do console do Firebase:

Configurações de autenticação

As políticas de senha Firebase Authentication são compatíveis com os seguintes requisitos de senha:

  • É necessário usar letras minúsculas

  • Caractere maiúsculo obrigatório

  • Caractere numérico obrigatório

  • É necessário um caractere não alfanumérico

    Os caracteres a seguir atendem ao requisito de caracteres não alfanuméricos: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • Tamanho mínimo da senha (variando de 6 a 30 caracteres; o padrão é 6)

  • Tamanho máximo da senha (4.096 caracteres)

É possível ativar a aplicação da política de senha em dois modos:

  • Exigir: não será possível se inscrever até que o usuário atualize a senha de acordo com sua política.

  • Notificar: os usuários podem se inscrever com uma senha que não está em conformidade com sua política. Ao usar esse modo, verifique se a senha do usuário está em conformidade com a política no lado do cliente e solicite que o usuário atualize a senha se ela não estiver em compliance.

Os novos usuários sempre precisam escolher uma senha que esteja em conformidade com sua política.

Se você tiver usuários ativos, recomendamos não ativar o upgrade forçado no login, a menos que tenha a intenção de bloquear o acesso de usuários com senhas que não obedecem à sua política. Em vez disso, use o modo de notificação, que permite que os usuários façam login com as senhas atuais e informa os requisitos que faltam na senha.

Recomendado: ativar a proteção contra enumeração de e-mails

Alguns métodos Firebase Authentication que usam endereços de e-mail como parâmetros vão gerar erros específicos se o endereço de e-mail não estiver registrado quando deveria estar (por exemplo, ao fazer login com um endereço de e-mail e uma senha) ou estiver registrado quando não deveria ser usado (por exemplo, ao alterar o endereço de e-mail de um usuário). Embora esses métodos sejam úteis para sugerir soluções específicas aos usuários, eles também podem ser usados indevidamente por agentes mal-intencionados para descobrir os endereços de e-mail registrados.

Para mitigar esse risco, recomendamos ativar a proteção contra enumeração de e-mails no seu projeto usando a ferramenta gcloud do Google Cloud. Como a ativação desse recurso muda o comportamento dos relatórios de erro do Firebase Authentication, verifique se o app não se baseia em erros mais específicos.

Próximas etapas

Depois que um usuário faz login pela primeira vez, uma nova conta de usuário é criada e vinculada às credenciais, que podem ser o número do telefone, o nome de usuário e a senha ou as informações do provedor de autenticação. Essa nova conta é armazenada como parte do projeto do Firebase e pode ser usada para identificar um usuário em todos os apps do projeto, seja qual for o método de login utilizado.

  • Você pode receber as informações básicas de perfil do usuário do objeto FirebaseUser nos seus aplicativos. Consulte Gerenciar usuários.

  • Nas Regras de segurança Firebase Realtime Database e Cloud Storage, você pode acessar o ID exclusivo do usuário conectado pela variável auth e usar essas informações para controlar quais dados um usuário pode acessar.

Os usuários podem fazer login no app usando vários provedores de autenticação. Basta vincular as credenciais desses provedores a uma conta de usuário.

Para desconectar um usuário, chame signOut:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();