Posted on: August 22, 2024 09:07 AM
Posted by: Renato
Categories: Oauth2 autenticacao PKCE
Views: 124
Aumentando a segurança com PKCE
PKCE (pronúncia pixie), acrônimo de Proof Key for Code Exchange, descrito na RFC 7636, originalmente foi criado como uma extensão do Authorization Code Flow, com o intuito de aumentar a segurança evitando um ataque onde o Authorization Code é roubado por aplicação maliciosa, que com o Authorization Code roubado, trocava por um Access Token válido ganhando acessos indevidos ao seu sistema.
PKCE consiste em o Client (aplicação consumidora) gerar um valor (string) aleatório chamado de Code Verifier, e então gerar um Hash (code challenge method) do Code Verifier, resultando no Code Challenge.
Com o Code Challenge gerado, então o Client (aplicação consumidora) envia no request por query string o Code Challenge e o Code Challenge Method (algoritmo utilizado para gerar o hash) para ao Authorization Server.
code_verifier = valor_gerado_aleatoriamente
code_challenge = SHA256(code_verifier)
code_challenge_method = SHA256
O “Authorization Server”, guarda o “Code Challenge” e o “Code Challenge Method” para uma verificação posterior, e após a autenticação acontecer, o “Authorization Server” devolve o “Code” para o client (aplicação consumidora).
Quando o “Client” (aplicação consumidora) for trocar o “Code” por um “Access Token”, envia também o Code Verifier. O Authorization Server ao receber os dados, gera o Code Challenge novamente com o Code Verifier recebido e compara com o Code Challenge recebido antes, sendo iguais, o Authorization Server tem a garantia de que a requisição para trocar o Code por um Access Token, partiu da mesmo Client que gerou o code.
De forma resumida, este diagrama acima representa o Authorization Code Flow com PKCE.
Dúvidas, críticas e sugestões, adicionem comentários e acompanhem as demais estórias.
public function loginWithOauth2WithoutSocialiteWithPKCE(){
session()->put('state', $state = Str::random(40));
session()->put('code_verifier', $code_verifier = Str::random(128));
$codeChallenge = strtr(rtrim(
base64_encode(hash('sha256', $code_verifier, true))
, '='), '+/', '-_');
$query = http_build_query([
'client_id' => config('services.oauth2_server.client_id'),
'redirect_uri' => 'http://client.test/oauth/callback/without-socialite-pkce',
'response_type' => 'code',
'scope' => '',
'state' => $state,
'code_challenge' => $codeChallenge,
'code_challenge_method' => 'S256',
]);
return redirect('http://oauth2-server.test/oauth/authorize?' . $query);
}
Donate to Site
Renato
Developer