Firebase Auth com Google SignIn
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:
- 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 :)