микрозаймы онлайн займы на карту займы по паспорту

Autenticação via Facebook 2

Nesse artigo faremos um sistema de autenticação, utilizando o Facebook para autenticar, através da biblioteca OAuth2. Parece complicado, mas com Laravel, isso é extremamente simples.

Para esse post, estou assumindo que você já teve algum contato com o framework, e tem uma instalação funcional dele em sua máquina.
Para configurar a autenticação com Facebook, será necessário configurar um virtualhost para sua aplicação, pois o Facebook não aceita domínio localhost. Poderá criar como localhost.com, que funcionará.

Iniciando

A primeira coisa a fazer é criar/configurar nosso banco de dados. A estrutura básica será a tabela users, a seguir:

 CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `username` varchar(45) NOT NULL,
  `password` varchar(128) NOT NULL,
  `email` varchar(128) NOT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp,
  PRIMARY KEY (`id`),
  KEY `username` (`username`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

Ok, agora vamos configurar nossa aplicação para conectar no banco, alterando o arquivo application/config/database.php
Em torno da linha 70, tem a definição de um array para conexão ao MySQL, altere para suas configurações, e lembre-se de verificar se o default está como mysql.

Criando a model do usuário

Ok, temos uma aplicação rodando e conectando ao nosso banco, vamos agora criar a model para referenciar na aplicação a tabela que acabamos de criar, para isso crie o arquivo application/models/user.php

class User extends Eloquent {

    public static $timestamps 	= true;

}

Pronto, essa classe não sofrerá mais alterações. A propriedade criada $timestamps, é para o framework cuidar da atualização dos campos created_at e updated_at, cada vez que um registro for inserido/modificado.

Instalando o bundle OAuth2

Bundles no Laravel são bibliotecas desenvolvidas de modo desacoplado de sua aplicação, para que possam ser usados em vários projetos sem problema nenhum. Vamos utilizar o bundle criado para autenticar via OAuth2. Você pode baixá-lo aqui (coloque a pasta dentro de application/bundles), ou instalá-lo utilizando a linha de comando do framework, acessando via terminal a raiz da sua aplicação, e digitando o comando:

php artisan bundle:install laravel-oauth2

Após instalado, temos que registrar o bundle no arquivo bundles.php:

return array(

	'docs' => array('handles' => 'docs'),
	'laravel-oauth2'

);

Criando uma aplicação no Facebook

Acesse sua conta no Facebook, depois abra esse link.
Crie uma nova aplicação, e configure-a mais ou menos como na imagem:

Configurando OAuth2

Anote o App ID e App Secret, pois iremos utilizá-lo agora. Crie um controller para controlar a autenticação. Crie o arquivo application/controllers/connect.php:

<?php
	
class Connect_Controller extends Base_Controller {

	public function action_session($provider) {

	    Bundle::start('laravel-oauth2');

	    $provider = OAuth2::provider($provider, array(
	        'id' => 'coloque_o_id_aqui',
	        'secret' => 'coloque_o_app_secret',
	    ));

	    if ( !Input::has('code') ) {
	        
	        return $provider->authorize();

	    }
      }
}

Criamos o método session, que receberá um parâmetro para definir o tipo de autenticação (no nosso caso o parâmetro será ‘facebook’). Ele instância a classe OAuth2, passando as credenciais da app que vc criou no Facebook. Caso o facebook não tenha retornado o token ($_GET[‘code’]), é por que ainda não foi autenticado, ai chamamos o método authorize(), que irá solicitar a autenticação.
PS: Para funcionar, primeiro registre o controller criado, alterando o arquivo routes.php, adicione:

Route::controller('connect');

Ao acessar localhost.com/connect/session/facebook, deverá ser redirecionado para a tela do Facebook, pedindo permissão para logar pela aplicação. Ao aceitar, será redirecionado para o seu controller, com alguns parâmetros por GET, sendo um deles o code, o qual iremos utilizar agora. Altere o método session criado em seu controller Connect:

public function action_session($provider) {

	    Bundle::start('laravel-oauth2');

	    $provider = OAuth2::provider($provider, array(
	        'id' => 'coloque_o_id_aqui',
	        'secret' => 'coloque_o_app_secret',
	    ));

	    if ( ! Input::has('code') ) {
	        
	        return $provider->authorize();

	    }
	        
        try {

            $params = $provider->access(Input::get('code'));

            $token = new OAuth2_Token_Access(array('access_token' => $params->access_token));

            $user_oauth = $provider->get_user_info($token);

            $user = User::where('email', '=', $user_oauth['email'])->first();
            /* 
             * Aqui poderá tratar de várias formas, se o usuário não for cadastrado, 
             * poderá cadastrá-lo automaticamente (como eu fiz), ou direcioná-lo para uma pág. de cadastro, 
             * já preenchendo o formulário com os dados recuperados do facebook.
             */
            if (!$user) {

            	$user = new User();
                $user->name     = $user_oauth['name'];
                $user->username = $user_oauth['nickname'];
                $user->email    = $user_oauth['email'];
                $user->save();

            }

            \Auth::login($user->id);
            return Redirect::to('auth'); //Redirecione para a área privada do sistema.

        }

        catch (OAuth2_Exception $e) {
            show_error('Falha ao autenticar: '.$e->getMessage());
        }
	    
}

Ok, finalizamos a integração, após esse ponto, o usuário já conseguirá fazer login na sua app através do Facebook. Caso ele ainda não tenha logado, o sistema vai inserir um registro automaticamente.
Simples, não?

Se você ainda não conhece como trabalhar com a classe Auth do Laravel, criei esse controller para mostrar como verifica se está logado, e como efetua logout:

<?php

class Auth_Controller extends Base_Controller {
	
	function action_index() {

		if (Auth::check()) {

			return 'Hello, ' . Auth::user()->name . '. ' . HTML::link('auth/logout', 'Logout');;

		} else {

			return HTML::link('connect/session/facebook', 'Login with Facebook');;

		}

	}

	function action_logout() {

		Auth::logout();
		return Redirect::to('auth');

	}

}

Não esqueça de registrar o controller em routes.php :-)

E é isso galera! Para baixarem o projeto, clique aqui.

PS: Tem um pequeno erro de digitação no bundle instalado, segue o link da correção, aqui.

Dúvidas, sugestões e elogios, deixem nos comentários :-)
Abraços, até a próxima.

(Artigo republicado, original em: http://blog.brayanrastelli.com/autenticando-facebook-com-oauth2-laravel/)

  • http://www.facebook.com/lcquinhone Luis Carlos Quinhone

    Legal, alguma coisa me impede de ter mais campos na tabela user como endereço, cidade etc?

    • http://brayanrastelli.com/ Brayan Rastelli

      Não tem problema algum.

      Apenas dê um print_r em $user_oauth para verificar se esses dados estão vindo (depende tanto da config. de privacidade do usuário, e se ele preencheu essas informações).

      O ideal é verificar se está setado, e se não tiver, gravar null

      Abraço !