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

  1. O cliente gera um code_verifier — uma string aleatória e criptograficamente segura.
  2. Deriva um code_challenge a partir dele, geralmente via SHA-256: code_challenge = BASE64URL(SHA256(code_verifier))
  3. Envia o code_challenge junto com a requisição de autorização ao servidor.
  4. O servidor armazena o code_challenge.
  5. Quando o cliente troca o authorization_code por um token, envia o code_verifier original.
  6. O servidor recalcula o hash e compara com o code_challenge armazenado. 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_secret seguro.
  • 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.