Cliente OAuth para PHP: guia completo de integração de autenticação
\n\nOAuth (Open Authorization) é um protocolo de autorização aberto que permite conceder a terceiros acesso limitado aos recursos do usuário sem transferir login e senha. No mundo PHP, existem várias bibliotecas para implementar OAuth 2.0, mas uma das mais populares e suportadas é a League\\OAuth2-Client (The PHP League). Esta biblioteca oferece uma forma flexível e segura de integrar login via Google, Facebook, GitHub, VK (VKontakte), Yandex e muitos outros serviços.
\n\nNeste artigo, abordaremos detalhadamente a instalação, configuração e uso do cliente OAuth para PHP com exemplos de autenticação via Google e VK. Você aprenderá como obter access token, refresh token e dados do perfil do usuário.
\n\nInstalação do cliente OAuth via Composer
\n\nPara começar, é necessário instalar a biblioteca principal e os provedores (adaptadores para serviços específicos). Execute no terminal:
\n\ncomposer require league/oauth2-client\ncomposer require league/oauth2-google\ncomposer require league/oauth2-vk\n\nA biblioteca suporta PSR-7 (mensagens HTTP) e PSR-18 (cliente HTTP), portanto, também é recomendado instalar o Guzzle ou qualquer outro cliente HTTP compatível:
\n\ncomposer require guzzlehttp/guzzle\n\nArquitetura básica do OAuth 2.0
\n\nO OAuth 2.0 em PHP funciona da seguinte forma:
\n- \n
- Client ID e Client Secret — obtidos ao registrar o aplicativo no serviço (Google Cloud Console, VK Developers, etc.). \n
- Redirect URI — URL no seu site para onde o serviço redirecionará o usuário após a autorização. \n
- Authorization Code — código temporário que é trocado por um access token. \n
- Access Token — chave para acessar a API do usuário. \n
- Refresh Token — permite renovar o access token sem nova autorização. \n
Exemplo: login via Google
\n\nVamos criar um manipulador simples para autenticação via Google. Presume-se que você já tenha client_id e client_secret.
Passo 1. Redirecionar o usuário para a página de autorização do Google
\n\n<?php\nrequire 'vendor/autoload.php';\n\n$provider = new \\League\\OAuth2\\Client\\Provider\\Google([\n 'clientId' => 'SEU_CLIENT_ID',\n 'clientSecret' => 'SEU_CLIENT_SECRET',\n 'redirectUri' => 'https://seu-site.com.br/callback.php',\n]);\n\n// Gera a URL de autorização\n$authUrl = $provider->getAuthorizationUrl([\n 'scope' => ['email', 'profile'], // permissões solicitadas\n]);\n\n// Salva o state na sessão para proteção contra CSRF\n$_SESSION['oauth2state'] = $provider->getState();\n\nheader('Location: ' . $authUrl);\nexit;\n\nPasso 2. Processamento do callback (callback.php)
\n\n<?php\nsession_start();\nrequire 'vendor/autoload.php';\n\n$provider = new \\League\\OAuth2\\Client\\Provider\\Google([\n 'clientId' => 'SEU_CLIENT_ID',\n 'clientSecret' => 'SEU_CLIENT_SECRET',\n 'redirectUri' => 'https://seu-site.com.br/callback.php',\n]);\n\n// Verifica o state para prevenir ataques CSRF\nif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {\n unset($_SESSION['oauth2state']);\n exit('State inválido');\n}\n\ntry {\n // Troca o authorization code por um access token\n $accessToken = $provider->getAccessToken('authorization_code', [\n 'code' => $_GET['code']\n ]);\n\n // Obtém os dados do perfil do usuário\n $resourceOwner = $provider->getResourceOwner($accessToken);\n $user = $resourceOwner->toArray();\n\n echo "Olá, " . htmlspecialchars($user['name']) . "!";\n echo "Email: " . htmlspecialchars($user['email']);\n // Salva o token no banco de dados para