Autenticar com o Google no Android (original) (raw)

Você pode permitir a autenticação de usuários no Firebase com Contas do Google.

Antes de começar

  1. Adicione o Firebase ao projeto para Android, caso ainda não tenha feito isso.
  2. 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 doFirebase Android BoMpara controlar o controle de versões da biblioteca.
    Além disso, como parte da configuração do Firebase Authentication, é necessário adicionar o SDK do Gerenciador de credenciais ao app.
    dependencies {
    // Import the BoM for the Firebase platform
    implementation(platform("com.google.firebase:firebase-bom:34.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")
    // Also add the dependencies for the Credential Manager libraries and specify their versions
    implementation("androidx.credentials🪪1.3.0")
    implementation("androidx.credentials:credentials-play-services-auth:1.3.0")
    implementation("com.google.android.libraries.identity.googleid:googleid:1.1.1")
    }
    Com a 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:24.0.1")
    // Also add the dependencies for the Credential Manager libraries and specify their versions
    implementation("androidx.credentials🪪1.3.0")
    implementation("androidx.credentials:credentials-play-services-auth:1.3.0")
    implementation("com.google.android.libraries.identity.googleid:googleid:1.1.1")
    }
  3. Caso você ainda não tenha especificado a impressão digital SHA do app, faça isso na página Configuraçõesdo console do Firebase. ConsulteComo autenticar seu clientepara mais detalhes sobre como conseguir a impressão digital SHA.
  4. Ative o Google como um método de login no Console do Firebase:
    1. No console do Firebase, abra a seção Auth.
    2. Na guia Método de login, ative o método de login do Google e clique em Salvar.
  5. Quando aparecer a solicitação no console, faça o download do arquivo de configuração atualizado do Firebase (google-services.json), que agora contém as informações do cliente OAuth necessárias para o login do Google.
  6. Mova esse arquivo de configuração atualizado para seu projeto do Android Studio _substituindo_o arquivo de configuração correspondente desatualizado. (Consulte Adicionar o Firebase ao projeto do Android).

Autenticar no Firebase

  1. Integre o recurso Fazer login com o Google ao seu app seguindo as etapas nadocumentação do Gerenciador de credenciais. Confira as instruções gerais:
    1. Instanciar uma solicitação de login do Google usandoGetGoogleIdOption. Em seguida, crie a solicitação do Gerenciador de credenciais usando GetCredentialRequest:

    Kotlin

    // Instantiate a Google sign-in request
    val googleIdOption = GetGoogleIdOption.Builder()
    // Your server's client ID, not your Android client ID.
    .setServerClientId(getString(R.string.default_web_client_id))
    // Only show accounts previously used to sign in.
    .setFilterByAuthorizedAccounts(true)
    .build()
    // Create the Credential Manager request
    val request = GetCredentialRequest.Builder()
    .addCredentialOption(googleIdOption)
    .build()

    Java

    // Instantiate a Google sign-in request
    GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
    .setFilterByAuthorizedAccounts(true)
    .setServerClientId(getString(R.string.default_web_client_id))
    .build();
    // Create the Credential Manager request
    GetCredentialRequest request = new GetCredentialRequest.Builder()
    .addCredentialOption(googleIdOption)
    .build();
    Na solicitação acima, é necessário transmitir o ID do cliente "servidor" para o método setServerClientId. Para encontrar o ID do cliente OAuth 2.0:
    1. Abra a página Credenciais no console do Google Cloud.
    2. O ID do cliente de tipo Aplicativo da Web é seu ID do cliente OAuth 2.0 do servidor de back-end.
    2. Depois de integrar o Fazer login com o Google, verifique se a atividade de login tem um código semelhante a este:

    Kotlin

    private fun handleSignIn(credential: Credential) {
    // Check if credential is of type Google ID
    if (credential is CustomCredential && credential.type == TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
    // Create Google ID Token
    val googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.data)
    // Sign in to Firebase with using the token
    firebaseAuthWithGoogle(googleIdTokenCredential.idToken)
    } else {
    Log.w(TAG, "Credential is not of type Google ID!")
    }
    }

    Java

    private void handleSignIn(Credential credential) {
    // Check if credential is of type Google ID
    if (credential instanceof CustomCredential customCredential
    && credential.getType().equals(TYPE_GOOGLE_ID_TOKEN_CREDENTIAL)) {
    // Create Google ID Token
    Bundle credentialData = customCredential.getData();
    GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credentialData);
    // Sign in to Firebase with using the token
    firebaseAuthWithGoogle(googleIdTokenCredential.getIdToken());
    } else {
    Log.w(TAG, "Credential is not of type Google ID!");
    }
    }

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

Kotlin

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

Java

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

Kotlin

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

Java

@Override
public void onStart() {
super.onStart();
// Check if user is signed in (non-null) and update UI accordingly.
FirebaseUser currentUser = mAuth.getCurrentUser();
updateUI(currentUser);
} 4. Agora, receba o token de ID do Google do usuário criado na etapa 1, troque-o por uma credencial do Firebase e faça a autenticação:

Kotlin

private fun firebaseAuthWithGoogle(idToken: String) {
val credential = GoogleAuthProvider.getCredential(idToken, null)
auth.signInWithCredential(credential)
.addOnCompleteListener(this) { task ->
if (task.isSuccessful) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithCredential:success")
val user = auth.currentUser
updateUI(user)
} else {
// If sign in fails, display a message to the user
Log.w(TAG, "signInWithCredential:failure", task.exception)
updateUI(null)
}
}
}

Java

private void firebaseAuthWithGoogle(String idToken) {
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, task -> {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
// If sign in fails, display a message to the user
Log.w(TAG, "signInWithCredential:failure", task.getException());
updateUI(null);
}
});
}
Se a chamada para signInWithCredential for concluída, será possível usar o método getCurrentUser para coletar os dados da conta do usuário.

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.

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. Você também precisa limpar o estado da credencial de usuário atual de todos os provedores de credenciais, conforme recomendado pela documentação do Gerenciador de credenciais:

Kotlin

private fun signOut() { // Firebase sign out auth.signOut()

// When a user signs out, clear the current user credential state from all credential providers.
lifecycleScope.launch {
    try {
        val clearRequest = ClearCredentialStateRequest()
        credentialManager.clearCredentialState(clearRequest)
        updateUI(null)
    } catch (e: ClearCredentialException) {
        Log.e(TAG, "Couldn't clear user credentials: ${e.localizedMessage}")
    }
}

}

Java

private void signOut() { // Firebase sign out mAuth.signOut();

// When a user signs out, clear the current user credential state from all credential providers.
ClearCredentialStateRequest clearRequest = new ClearCredentialStateRequest();
credentialManager.clearCredentialStateAsync(
        clearRequest,
        new CancellationSignal(),
        Executors.newSingleThreadExecutor(),
        new CredentialManagerCallback<>() {
            @Override
            public void onResult(@NonNull Void result) {
                updateUI(null);
            }

            @Override
            public void onError(@NonNull ClearCredentialException e) {
                Log.e(TAG, "Couldn't clear user credentials: " + e.getLocalizedMessage());
            }
        });

}