Firebase Auth com Google SignIn

Dario Mungoi
5 min readAug 15, 2016

No últimos 2 posts, escrevi sobre o realtime database do Firebase e a esta altura já devemos saber como:
1. Criar um projecto no Firebase e utilizar o console.
2. Estruturar e escrever dados para uma realtime database a partir do console.
3. Escrever e ler os dados na realtime database a partir de uma android app.

Até aqui esta tudo bem e só com a realtime database é possível desenvolver uma app simples de e-commerce que até então só lista os itens existentes na realtime database como apresentado nos posts anteriores.( ire postar o código completo no fim da série).

Apesar de até então podermos desenvolver uma app e publicar no playstore, não poderíamos permitir que os utilizadores personalizassem a app ao seu gosto( marcar itens como favorito) e qualquer utilizador poderia modificar e apagar dados na realtime database que não lhe dizem respeito pois até este momento não existe nenhum tipo de autenticação e não é necessário nenhum tipo de autorização para realizar operações na realtime database.

Por este motivo, este post será focado em como utilizar o serviço de Autenticação do Firebase para que possamos autenticar os utilizadores e posteriormente utilizar esta informação para definir regras de segurança sobre o que este estará autorizado ou não a ver.

O Firebase Auth, é um serviço disponível no firebase e tem como objectivo oferecer mecanismos de autenticação que permitem que os nossos utilizadores autentiquem-se utilizando diferentes formas e provedores como o Google, Facebook ,Twitter, Github a combinação de e-mail/password ou um mecanismo nosso caso já tenhamos um desenvolvido.

Ao autenticar um utilizador utilizando o serviço Firebase Auth, será criado um utilizador do projecto que irá conter um id único e a informação básica do profile que poderá conter só o e-mail para o caso de um sistema de autenticação utilizando e-mail/password ou mais detalhes como nome, e-mail, foto de perfil para o caso de providers como o Google Signin, facebook etc. Nota que este utilizador fica guardado em uma base de dados de utilizadores do projecto e todas outras apps existentes no projecto do Firebase terão acesso a eles.

Para começar a implementar o serviço do Firebase Auth em um app android existem 2 formas e a primeira consiste em utilizar a biblioteca Firebase UI que já oferece toda UI de login fácil de modificar para que fique a cara da nossa app e o código para os diferentes mecanismos de autenticação devidamente organizados a espera que sejam colocados os parâmetros em falta como ApiKey, ClientId e outros dependendo do provider.

A segunda forma consiste em trabalhar com cada provider de forma independente e aprender o que esta por detrás da FirebaseUI Library.

Neste post iremos aprender como implementar o Firebase Auth service com o Google Sign in e guardar informações sobre os nossos utilizadores na realtime database.

Vamos começar por fazer as devidas configurações do projecto adicionando a dependências as bibliotecas do Firebase que contem todas as classes necessárias para utilizar o serviço de autenticação e as bibliotecas do google play services que contem todas as classes para utilizar o Google SignIn.

compile 'com.google.firebase:firebase-auth:9.2.0'
compile 'com.google.android.gms:play-services-auth:9.2.0'

Com as dependências devidamente implementadas o próximo passo é começar com a implementação do signin utilizando o Google SignIn que pude escrever de forma detalhada em um post anterior disponível AQUI(Importante Ler para o resto do Post).

Como explicado no post sobre o Google SignIn, ao pressionar o botão de Login, inicializamos a Activity que nos permite escolher uma das contas disponíveis no dispositivo ou adicionar uma nova a ser utilizada no processo de autenticação.
Ao seleccionar a conta, a Activity é encerrada e o método onActivityResult será invocado trazendo a resposta sobre o sucesso ou não da autenticação como mostra o exemplo abaixo.

//Dentro da classe LoginPresenterImpl
@Override
public void handleActivityResults(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case LoginActivity.GOOGLE_SIGNIN_RC:{
GoogleSignInResult mResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if(mResult.isSuccess()){
GoogleSignInAccount mSignInAccount = mResult.getSignInAccount();
firebaseAuthWithGoogle(mSignInAccount);
}
else{
//Aconteceu algum error
}
break;
}
}
}

Após receber a resposta de sucesso do processo de sign in, o passo seguinte é utilizar esta conta do Google para autenticar-se no Firebase seguindo os seguintes passos:

  1. Criar uma credencial que será utilizada pelo servidor do Firebase para autenticar utilizadores utilizando a classe AuthCredential.
    Esta credencial é criada utilizando o método estático getCredentials() da classe GoogleAuthProvider que recebe a idToken e a accessToken disponibilizadas pelo SDK do Google SignIn.
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);

2. Assim como na realtime database, para utilizar o serviço de autenticação devemos primeiro obter a instância logo no inicio da activity/fragment.

private FirebaseAuth mAuth = FirebaseAuth.getInstance();
private FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();

3. Utilizar a instância do FirebaseAuth para fazer o signin utilizando a credencial ao invocar o método signInWithCredential que recebe a credencial criada no passo 1.
De seguida adicionamos o listener onCompleteListener para que possamos receber a resposta do processo dentro do método de callback onComplete que nos passa um AuthResult com a informação sobre o FirebaseUser criado ou retornado pela operação.
Dentro deste método podemos finalmente pegar o nosso FirebaseUser e criar um perfil do utilizador na realtime database com informações adicionais como mostram o seguinte Gist com a implementação final do método.

E desta forma chegamos ao fim de mais um post desta serie sobre o Firebase e o código correspondente a todas as classes utilizadas para este exemplo encontram-se AQUI.
Com a autenticação feita, o próximo post será sobre como definir regras de segurança na realtime database para garantir que só os utilizadores autenticados possam realizar operações de escrita/modificação a locais que estes estejam autorizados a tal.

Obrigado por ter reservado um tempo para ler a este post e caso tenha alguma dúvida ou sugestão, não hesite em deixar um comentário para que possamos conversar!

Abraços :)

--

--

Dario Mungoi

Senior Android Developer at @Shopify, Design Sprint Master, former Android GDE