Concrete Logo
Hamburger button

Como fazer login com Facebook usando Java: Client OAuth 2.0

  • Blog
  • 22 de Maio de 2014
Share

São cada vez mais comuns sites pedem login com Facebook, uma vez que é uma maneira mais simples de conferir a veracidade dos dados inseridos pelo usuário. Neste post, vou mostrar como obter as informações de um usuário no Facebook utilizado a Graph API e como funciona o fluxo para ter acesso a estas informações com Java.

O Facebook disponibiliza para qualquer desenvolvedor o acesso a uma rica API chamada Graph API (https://developers.facebook.com/docs/graph-api). Com ela, a partir de chamadas HTTP, é possível fazer consultas e ações no Facebook, como recuperar dados de usuários, fazer postagens na timeline do usuário, criar álbum e postar fotos entre várias outras tarefas que podem ser verificadas no link acima.

Para executar essas tarefas, é necessário ter permissões. E é aqui começa o assunto deste post.

A Graph API utiliza o OAuth 2.0 como padrão (ou protocolo) de autorização.

O que é OAuth 2.0?

É uma especificação e padrão de autorização, que define um fluxo de autorização entre usuários/aplicações e clientes/aplicações servidoras. A especificação completa é encontrada nesta página. A versão 2.0 é uma evolução do OAuth 1.0 e surgiu a partir da necessidade de padronizar o acesso de uma aplicação a outras aplicações (tanto da aplicação servidora quanto da aplicação cliente).

Entre os vários pontos positivos, destaca-se não ser necessária a aplicação cliente conhecer as credenciais (login e senha) do usuário na outra aplicação. Por exemplo: para um usuário postar sua foto do Instagram no Facebook, o Instagram não precisa saber a senha do usuário no Facebook. Como observação, no modelo OAuth é possível a aplicação cliente conhecer as credenciais do usuário.

Hoje, o OAuth é usado pelo Google, Facebook, Twitter, DropBox, Salesforce, entre outros.

Como é o fluxo de autorização?

Antes de conhecer o fluxo, é importante conhecer os papéis envolvidos:

  • Resource Server – é a aplicação que possui os recursos protegidos pelo OAuth que podem ser acessados via Rest.
  • Resource owner (user) – é dono dos recursos protegidos. No Facebook: dados cadastrais, amigos, fotos, etc.
  • Client – é a aplicação cliente, que faz requisições à API protegida. Pode-se dizer que é a aplicação utilizada pelo user.
  • Authorization Server – Responsável por dar acesso ao recursos protegidos por meio de um token que é enviado para o client quando há autorização do user.

O OAuth sugere dois modelos de fluxo:

No primeiro, o client conhece as credencias do usuário e realiza o fluxo para obtenção do token. Este modelo é mais recomendado para redes fechadas (entre aplicações corporativas, por exemplo).

No segundo, o cliente não conhece as credenciais do cliente, o usuário faz login em outra página e segue o fluxo para obtenção do token. Neste caso, melhor para ser usado em ambientes abertos.

Segue um breve resumo do fluxo, apenas do segundo caso:

  1. O usuário está em uma aplicação (client) e essa aplicação deseja acessar um recurso protegido do usuário em outra aplicação.
  2. O client faz uma chamada ao authorization server por meio de uma url passando 3 parâmetros (cliente id, cliente secret e redirect url) e o usuário é redirecionado para uma nova página.
  3. O usuário fornece suas credenciais e a autorização para o cliente acessar seus recursos privados.
  4. Após o cliente conceder autorização, o servidor de autenticação faz um redirect para a página passada como parâmetro (redirect url) passando de volta o parâmetro token.
  5. De posse do token, o cliente pode solicitar o acesso ao recurso protegido, enviando o token na requisição.

Como fazer login de um usuário via Facebook?

Agora, entendendo o fluxo básico de funcionamento do OAuth, faremos um exemplo em Java de login via Facebook em um aplicação.

Antes de executarmos o fluxo apresentado acima, é necessário informar ao Facebook que você deseja acessar a Graph API. Para isto, você deve criar uma aplicação no Facebook acessando esta página.

login-usando-java

 

Após cadastrar, você será redirecionado para o Dashboard da sua aplicação:

login-usando-java2

 

Clique em Settings e em Add Platform e adicione um website:

login-usando-java3

 

O campo Site URL é para onde o servidor redireciona ao retornar o token. Como teste, você pode preencher o Site URL com o localhost para testar.

Feito isso, você já tem uma aplicação (client) cadastrada.

Agora vamos para o código Java.

Neste exemplo não usarei nenhuma lib em especial que auxilie a implementar um client Oauth ou auxilie na integração com o Facebook, para que o fluxo fique bem visível. Como informação, existem as libs restfb ou facebook4j, que abstraem muitos detalhes.

Fiz uma aplicação com Spring MVC para ser nosso Client. O código pode ser baixado em: https://github.com/glendon/testefacebook

A primeira classe é um controller, que faz o redirect para a página de permissão do Facebook e outro método para ser chamado quando o faFebook fizer o redirect na volta para nosso client.

A classe LoginFacebook possui tudo o que é necessário para obter as informações do usuário.

As variáveis client_id , client_secret, e redirect_uri, devem ser preenchidas com o valor dos seguintes campos da tela Settings acima:

client_id = App Id

client_secret = App secret

redirect_uri = Site URL **

**No meu caso, alterei o Site URL para: https://localhost:8080/testeconcrete/loginfbresponse

O método getLoginRedirectURL constrói a primeira URL que será executada. Repare no campo scope. É neste campo que indicamos o que queremos ter como acesso. Só usaremos e-mail e publish_actions. Mais scopes podem ser consultados nesta página.

O método obterUsuarioFacebook recebe como parâmetro um code de autorização. Esse code é usado na linha abaixo:

Com isso, obtém uma string de retorno. Seu conteúdo contém dois campos: token e o expires. O token é a autorização para acessar os recursos e os expires pode ser usado para calcular o tempo de duração desse token (não entraremos nesse ponto).

Você pode debugar o token retornado na seguinte página: https://developers.facebook.com/tools/debug/accesstoken

De posse do token, a linha abaixo recupera o json com as informações do usuário:

Para manipular o json que virá como resposta, usaremos a classe JSONObject, cuja lib pode ser obtida em: https://mvnrepository.com/artifact/org.json/json/20140107

Como wrapper do Json, a classe auxilia na conversão dos dados do json, como demonstrado no construtor abaixo:

Assim, de posse todas as informações do usuário, você pode realizar o login (jogar esses dados na sessão, por exemplo) e/ou cadastrar este usuário na sua aplicação.

Tudo certo? Se tiver alguma dúvida, comentário ou sugestão, é só deixar nos campos abaixo! Até a próxima.