Login Social no Laravel com Socialite
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: facebook
, twitter
, linkedin
, google
, github
, gitlab
, 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.
De um nome para ele.
Dentro do projeto vamos no menu lateral “Credenciais” e em seguida “Criar Credenciais” e “ID do cliente OAuth”.
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.
Crie a tela de permissão.
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.
E pronto, temos o client_id
(ID de cliente) e client_secret
(chave secreta de cliente) para utilizarmos no 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
Selecionamos o tipo de aplicativo.
Fornecemos os detalhes do aplicativo.
Adicionamos o produto Login do Facebook.
Selecionamos o tipo como Web e configuramos a url do site.
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.
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
).
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++.