Fazer login social com Laravel é bastante simples utilizando o plugin Socialite. Com ele podemos realizar a autenticação de usuários nos principais provedores de OAuth como Facebook, Twitter, LinkedIn, Google, GitHub, etc.

Para nosso exemplo partimos do principio que temos uma aplicação Laravel instalada do zero. Então iremos começar instalando o componente do Socialite através do composer.

composer require laravel/socialite

O próximo passo será configurar as credenciais do provider OAuth, fazemos isso no arquivo /config/services.php, nele adicionamos como chave um dos providers suportados: facebooktwitterlinkedingooglegithubgitlab, ou bitbucket. Devemos lembrar que podemos adicionar quantos providers quisermos para permitir a autenticação em diversos fornecedores.

// config/services.php

'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'),
    'client_secret' => env('GOOGLE_CLIENT_SECRET'),
    'redirect' => 'https://socialite.botecodigital.dev.br/auth/google/callback',
],

'facebook' => [
    'client_id' => env('FACEBOOK_CLIENT_ID'),
    'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
    'redirect' => 'https://socialite.botecodigital.dev.br/auth/facebook/callback',
],

No exemplo acima vamos utilizar o provider do Google e do Facebook, e o cliente_id e cliente_secret serão pegos do arquivo .env, então não se esqueça de adicionar as entradas nele

// .env

GOOGLE_CLIENT_ID=XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=XXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXX

FACEBOOK_CLIENT_ID=XXXXXXXXXXXXXXX
FACEBOOK_CLIENT_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

E por último a url de redirecionamento(chave redirect), esta é a url do seu aplicativo que será chamada depois da autenticação no provider e nela que iremos recuperar os dados do usuário. Lembrando que ela também deverá ser registrada no provedor OAuth quando for feito o cadastro.

Criando o CLIENT_ID e CLIENT_SECRET no Google

Para obter o client_id e o client_secret do Google para fazermos a autenticação precisamos primeiro criar um projeto Google API, e lembrando que para isso precisamos de uma conta Google.

Primeiro criamos um projeto.

Tela de listagem de projetos do google api
Tela de listagem de projetos do Google API

De um nome para ele.

Tela de criação de projeto no google api

Dentro do projeto vamos no menu lateral “Credenciais” e em seguida “Criar Credenciais” e “ID do cliente OAuth”.

Selecionando a criação de credenciais do google

Antes da chegarmos na tela da criação do ID devemos configurar a tela de consentimento. Se este processo ainda não foi realizado será exibida a tela abaixo.

Solicitação para criar tela de consentimento para cliente oauth

Crie a tela de permissão.

tela configuração do tipo de uso(tipo usuario) do cliente do oauth.

Na próxima tela será pedido o Nome do Aplicativo, Email para suporte, a Página inicial do aplicativo, links para a politica de privacidade, os domínios autorizados(deve corresponder ao domínio onde o site/sistema esta hospedado) e email de contato do desenvolvedor. Após salvar será redirecionado para uma nova tela onde poderá adicionar os e-mails dos usuários de teste. Lembrando que até o aplicativo ser verificado somente estes usuários conseguirão realizar a autenticação. Depois é só clicar em Salvar e continuar.

Na tela de Criar “ID do Cliente OAuth” selecionamos o tipo de aplicativo “Aplicativo Web”, e adicionamos a URL de redirecionamento, sendo esta a mesma que utilizamos no provider do Socialite.

Tela da criação do cliente de id oauth, onde informamos a url de callback

E pronto, temos o client_id (ID de cliente) e client_secret (chave secreta de cliente) para utilizarmos no Socialite.

tela de exibição do client_id e secret_id do oauth google
client_id e client_secret do Google para o Socialite

Criando o CLIENT_ID e o CLIENT_SECRET no Facebook

Para obter um client_id e client_secret no Facebook, primeiro devemos ter uma conta de Desenvolvedor e acessar https://developers.facebook.com/apps/.

Após vamos para criar um aplicativo

tela inicial da facebook developers com botão para criar aplicativo

Selecionamos o tipo de aplicativo.

tela de seleção de tipo de aplicativo do faccebook

Fornecemos os detalhes do aplicativo.

tela para fornecer os detalhes do aplicativo do facebook

Adicionamos o produto Login do Facebook.

tela com lista dos produtos facebook onde selecionamos o login do facebook

Selecionamos o tipo como Web e configuramos a url do site.

tela para fornecemos a url do site que irá utilizar o recurso de logn do facebook

Mudamos o public_profile para Advance Access como solicitado.

Agora vamos no menu lateral Login do Facebook -> Configurações e inserimos as urls de redirecionamento(nossa url de callback configurada em services.php) e o domínio permitido. Lembrando se esta configurações forem diferentes do domínio ou urls do aplicativo ele não irá funcionar.

tela de configuração onde inserirmos a url de callback e dominio do site/sistema que irá utiliar o login social

Após é só ir no menu lateral, Configurações -> Básico e copiar o ID do Aplicativo(client_id) e Chave Secreta do Aplicativo(client_secret).

tela de exibição do client_id e client_secret do facebook

Configurando as Rotas do Socialite

Uma vez com as chaves configuradas o restante é bastante simples, primeiro adicionamos as rotas que o Socialite utiliza, primeiro precisamos de uma rota de redirecionamento, nesta rota o socialite irá realizar o redirecionamento para a página de autenticação do provedor OAuth escolhido. Após feita a autenticação no provedor ele irá redirecionar para a rota de callback, que configuramos tanto no arquivo services.php quanto no próprio provedor quando criamos nossas chaves.

Route::get('/auth/{driver}/redirect', [AuthController::class,'redirect']);
Route::get('/auth/{driver}/callback', [AuthController::class,'callback']);

Como vamos utilizar dois provedores recebemos qual driver de provedor vamos utilizar pela rota, e passamos para o método do controle AuthController.

public function redirect(string $driver)
{
    return Socialite::driver($driver)->redirect();
}

public function callback(string $driver)
{
    $user = Socialite::driver($driver)->user();

    $dbUser = User::where('email', $user->email)->where('driver',$driver)->first();

    if($dbUser){
        Auth::login($dbUser);
    }else{
        $user = User::create([
            'name' => $user->getName(),
            'email' => $user->getEmail(),
            'password' => Hash::make( date('ymdhis') ),
            'driver' => $driver,
            'avatar' => $user->getAvatar(),
         ]);
         Auth::login($user);
     }
        
    return redirect()->route('area-51');
}

No método redirect apenas recebemos o nome do driver pela url e passamos para o método driver da facade Socialite e então chamamos o método redirect dele. Ele irá realizar o redirecionamento com todos os parâmetros necessário.

Após o usuário realizar a autenticação ele será redirecionado para o método callback com o driver passado pela url. Para pegar os dados do usuário que foi autenticado, chamamos o método driver do facade Socialite e então o método user que irá nos retornar um objeto com os dados do usuário. Dependendo do provedor diferentes variáveis e métodos podem estar disponíveis, mas em todos podemos fornecedores podemos utilizar getId(), getNickname(), getName(), getEmail() e getAvatar().

No nosso exemplo buscamos no banco se o e-mail do usuário autenticado e o driver utilizado existem, se sim apenas fazermos a autenticação utilizando o método login da facade Auth, se não este usuário nunca realizou o login e ainda não esta no banco criamos um novo registro pegando as informações do objeto $user retornado pelo Socialite e logamos o usuario utilizando o método login do facade Auth. Por fim redirecionamos para uma rota protegida.

Bom como podemos ver é bastante simples utilizar o login social através do Socialite, na minha opinião é mais complicado fazer o cadastro nos provedores de OAuth do que o código 🙂

Bom era isso espero que tenha ajudado. T++.