PKCE (Proof Key for Code Exchange, pronunciado “pixy”) é uma extensão do fluxo OAuth 2.0 Authorization Code, criada para proteger aplicações públicas — como SPAs (Single Page Apps) e apps mobile — contra ataques de interceptação do código de autorização.
O problema que resolve
No fluxo OAuth tradicional, um client_secret é usado para provar a identidade do cliente ao trocar o código de autorização por um token de acesso. Porém, apps mobile e SPAs não conseguem guardar segredos com segurança (o código é acessível ao usuário/atacante). Se um atacante interceptar o authorization_code, ele poderia trocá-lo por um token.
Como funciona
- O cliente gera um
code_verifier— uma string aleatória e criptograficamente segura. - Deriva um
code_challengea partir dele, geralmente via SHA-256:code_challenge = BASE64URL(SHA256(code_verifier)) - Envia o
code_challengejunto com a requisição de autorização ao servidor. - O servidor armazena o
code_challenge. - Quando o cliente troca o
authorization_codepor um token, envia ocode_verifieroriginal. - O servidor recalcula o hash e compara com o
code_challengearmazenado. Se bater, emite o token.
Um atacante que interceptar o authorization_code não consegue usá-lo porque não conhece o code_verifier.
Por que usar
- Protege apps que não podem ter um
client_secretseguro. - Hoje é recomendado inclusive para aplicações confidenciais (servidores backend), como boa prática geral.
- É exigido por padrão em OAuth 2.1.
Em resumo: PKCE garante que só quem iniciou o fluxo de autorização consegue completá-lo.