Autorização com OAuth2 no Laravel

Além da autenticação típica baseada em autenticação local, o Laravel também oferece uma maneira simples e conveniente de se autenticar com provedores OAuth usando o Laravel Socialite .

“O OAuth2 é um protocolo aberto que fornece fluxos de autorização específicos para aplicativos da Web, aplicativos de desktop, telefones celulares e dispositivos de sala de estar”, de acordo com a documentação oficial. A primeira versão, OAuth, também disponível para Laravel, é problemática para autenticação com dispositivos móveis, então evite-a.

A figura 1 mostra os participantes e seus respectivos papéis no OAuth. Sendo que o Resource Owner é o usuário, que pretende acessar o Resource Server. O resource Owner usa um cliente, que pode ser uma aplicação web ou móvel, que envia usuário e senha para o Authorization Server, o provedor, que devolve ao cliente um código de autorização que é usado para gerar token de acesso ao Resource Server.

Participantes e papéis no processo de autorização OAuth

Na figura 2, você pode ver o fluxo do modelo OAuth, com o usuário passando sua conta e senha para o site do provedor, com isso a aplicação cliente recebe um código de autorização que será usado para gerar um token para autenticação no servidor de recursos.

Socialite atualmente suporta autenticação com Facebook, Twitter, LinkedIn, Google, GitHub, GitLab, Bitbucket e outros cerca de 130 provedores de autorização. Basta você selecionar os que sejam de seu interesse.

Com o protocolo você aproveita para trocar o uso da tradicional autenticação com usuário e senha — armazenados em sua aplicação, também permitindo que seu público faça autenticação e/ou autorização a partir de provedores. É algo que pode trazer conforto ao usuário, que deixa de lado a criação de uma conta para acesso exclusivo a uma aplicação web ou para dispositivos móveis. O PHP não roda em dispositivos, móveis, mas fazendo uso de uma API, sua aplicação Laravel pode ter um frontend Angular, Vue.js ou React, combinando a isso o OAuth2.

Uma boa prática é usar frameworks maduros para autenticação. Assim você diminui riscos de ataque, pois códigos maduros passaram por variadas formas de ataques ao longo do tempo, com recursos mais difíceis de implementar até mesmo para um programador experiente. Há casos de grandes empresas que desenvolveram componentes de autenticação e, depois de grande investimento, foram alvo de suas vulnerabilidades. Para isso, o Laravel dispõe de autenticação com implementação simples, que depende poucos comandos e ajustes nas rotas. Com isso, o você cria tela de acesso, cadastro de usuários e recuperação de senha. Em seguida, os usuários com respectivas senhas já podem ser criados pela aplicação.

Instalação do Socialite


Com o Composer, adicione o Socialite ao projeto:

composer require laravel/socialite

Configuração

Para continuar, você precisa fazer o cadastro de sua aplicação. No Facebook, vá ao site developer.facebook.com, faça o cadastro, informe os endereços dos termos de serviço e o de privacidade de sua aplicação. Ao criar a aplicação, pegue o ID e secret dela, em seguida inclua em config/services.php,informando também a URL de redirecionamento.

'facebook' => [
'client_id' => env('FACEBOOK_CLIENT_ID'),
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
'redirect' => 'http://your-callback-url',
],

Roteamento

Agora, é a hora de autenticar os visitantes de sua aplicação. São 2 rotas: uma para redirecionar o usuário para o provedor OAuth e outra para receber o retorno de chamada do provedor após a autenticação. Então é acessar o Socialite, usando a fachada Socialite, editando o arquivo app/Http/Controller/Auth/LoginController.php:

<?php
namespace App\Http\Controllers\Auth;
use Socialite;
class LoginController extends Controller
{
/**
* Redirect the user to the GitHub authentication page.
*
* @return \Illuminate\Http\Response
*/
public function redirectToProvider()
{
return Socialite::driver('facebook')->redirect();
}
/**
* Obtain the user information from Facebook.
*
* @return \Illuminate\Http\Response
*/
public function handleProviderCallback()
{
$user = Socialite::driver('facebook')->user();
// $user->token;
}
}

Enquanto o métodoredirectfaz o envio do usuário para o provedor OAuth, o método usercheca a solicitação recebida e pega as informações do usuário do provedor.

Então, defina agora as rotas para seus métodos de controle, em routes/web.php:

Route::get('login/faceboook', 'Auth\LoginController@redirectToProvider');
Route::get('login/facebook/callback', 'Auth\LoginController@handleProviderCallback');

Autenticação sem estado

Com o método stateless você desabilita a verificação do estado da sessão, o que combina com autenticação social a uma API, no caso o Facebook:

$user = Socialite::driver('facebook')->userFromToken($token);

Pegando os detalhes do usuário

Com a instância do usuário, você pode pegar mais alguns detalhes sobre ele:

$user = Socialite::driver('facebok')->user();
// OAuth Two Providers
$token = $user->token;
$refreshToken = $user->refreshToken; // not always provided
$expiresIn = $user->expiresIn;
// OAuth One Providers
$token = $user->token;
$tokenSecret = $user->tokenSecret;
// All Providers
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
//fonte laravel.com

Pegando detalhes do usuário de um token

Ao autenticar-se, o usuário permite que a API passe para sua aplicação um token que permite acesso a detalhes do cliente, com o método userFromToken:Ao autenticar-se, o usuário permite que a API passe para sua aplicação um token que permite acesso a detalhes do cliente, com o método userFromToken:

$user = Socialite::driver('facebook')->userFromToken($token);

A maioria das pessoas não usa senhas seguras, e elas tendem a usar o mesmo nome de usuário e senha para todas as suas contas — redes sociais, bem como contas bancárias. Os atacantes/agressores exploraram isso criando mash-ups atraentes. Eles não precisavam gastar ciclos caros com ataques de força bruta. Nós voluntariamente damos as nossas credenciais para ver coisas bacanas!

À medida que a web amadureceu, ficou claro que precisávamos de alguma forma de autorização delegada para proteger os usuários, permitindo-lhes dar acesso para outros sites aos seus dados. Assim, o OAuth surgiu.

Mas o OAuth possui vulnerabilidade de segurança. Então, ao implementá-lo cuidado com a Open redirectors. É recomendado validar a URL que vem do usuário e até mesmo usar uma white list de URLs para evitar dissabores.

Por falar em segurança, você deve usar o protocolo HTTPS, que criptografa o tráfego de dados de entre sua aplicação e o cliente, com isso você também evita alertas de navegadores como Chrome e Firefox, de que sua aplicação é insegura. Há opção de certificado de segurança grátis. Outra vantagem de sua implementação é um ganho no ranqueamento feito por sites de busca como Google, por exemplo, que valorizam seu uso.

De certa forma, o framework Laravel veio para dar uma nova vida à linguagem de programação PHP. De acordo com o site Wappalizer, Laravel é o framework web mais popular em linguagem PHP, além de se destacar entre os concorrentes com linguagem de programação com acesso a banco de dados.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *