Como aprender OAuth 2.0 do zero: guia passo a passo

Como aprender OAuth 2.0 do zero: guia passo a passo





Como aprender OAuth 2.0 do zero — passo a passo | Yurideveloper


1. Fundamentos de OAuth 2.0

OAuth 2.0 não autentica o usuário, ele autoriza acesso a recursos protegidos. Os papéis-chave são:
Resource Owner (proprietário dos recursos), Client (aplicação), Authorization Server (servidor de autorização) e Resource Server (servidor de recursos).
O fluxo envolve tokens de acesso (e, opcionalmente, refresh_token) e scopes que definem o nível de permissão. Campos como redirect_uri e state ajudam a manter o controle de onde a resposta chega e a proteger contra CSRF.

Principais conceitos para entender rapidamente:

  • Authorization Endpoint: onde o usuário concede permissão.
  • Token Endpoint: onde o código de autorização é trocado por tokens.
  • Redirect URI: URL de retorno após o usuário conceder permissão.
  • Scopes: permissões adicionais solicitadas pelo client.
  • State: valor aleatório para mitigar ataques CSRF.

2. Fluxos comuns e quando usar

Fluxos mais usados no ecossistema moderno:

  • Authorization Code (com PKCE para apps públicas): recomendado para aplicações web, móveis e SPA que não podem manter segredo. Segue o padrão atual para maior segurança.
  • Implicit (deprecated em muitos cenários): antes usado em SPA, mas agora desaconselhado devido a maiores riscos de exposição de tokens.
  • Client Credentials: para comunicação entre serviços (service-to-service) sem usuário; funciona com aplicações confiáveis.
  • Resource Owner Password Credentials: historicamente usado, mas geralmente não recomendado por exigir que o usuário compartilhe credenciais com o client.

Destaque: PKCE (Proof Key for Code Exchange) é essencial para clients públicos. Ele evita a necessidade de um client_secret confidencial e reduz ataques de interceptação durante a troca do código de autorização.

3. Guia de implementação passo a passo: Authorization Code com PKCE

  1. Registre o client no Authorization Server (informando redirecionamento seguro e tipo de client).
  2. Escolha o fluxo Authorization Code com PKCE para clientes públicos.
  3. Gere um code_verifier aleatório e derive code_challenge via SHA-256 (PKCE).
  4. Construa a URL de autorização com: response_type=code, client_id, redirect_uri, scope, state, code_challenge e code_challenge_method=S256.
  5. Redirecione o usuário para o Authorization Server e receba o código na redirect_uri; valide o state para evitar CSRF.
  6. Troque o código por tokens no Token Endpoint enviando grant_type=authorization_code, code, redirect_uri, client_id e code_verifier (não inclua client_secret para apps públicos).
  7. Receba access_token (e, se suportado, refresh_token e id_token para OpenID Connect).
  8. Valide tokens: verifique assinatura, issuer (iss), audience (aud) e expiração (exp); trate o refresh conforme necessário.
  9. Implemente revalidação de privileges e scopes periodicamente; rotate tokens conforme política de segurança.

Observação prática: a PKCE adiciona code_verifier no passo de troca do código; a code_challenge é enviada na autorização. Isso assegura que o cliente que iniciou a requisição seja o mesmo que troca o código.

Exemplo de diagrama simplificado de endpoints envolvidos:

  • Authorization Endpoint: https://provider.example.com/oauth2/authorize
  • Token Endpoint: https://provider.example.com/oauth2/token

Para facilitar a visualização, segue um exemplo mínimo de código para gerar PKCE e construir a URL de autorização:


// Gerar PKCE (code_verifier e code_challenge) e construir URL de autorização
const crypto = require('crypto');

function base64url(buffer) {
  return buffer.toString('base64')
    .replace(/=/g, '')
    .replace(/\+/g, '-')
    .replace(/\//g, '_');
}

function generatePkcePair() {
  const code_verifier = base64url(crypto.randomBytes(32));
  const hash = crypto.createHash('sha256').update(code_verifier).digest();
  const code_challenge = base64url(hash);

  return { code_verifier, code_challenge };
}

const { code_verifier, code_challenge } = generatePkcePair();

const params = new URLSearchParams({
  response_type: 'code',
  client_id: 'SEU_CLIENT_ID',
  redirect_uri: 'https://seu-app.example.com/callback',
  scope: 'read write',
  state: 'ALGUN_ESTADO_aleatorio',
  code_challenge: code_challenge,
  code_challenge_method: 'S256'
});

const authorizationUrl = `https://provider.example.com/oauth2/authorize?${params.toString()}`;

console.log('PKCE code_verifier:', code_verifier);
console.log('Authorization URL:', authorizationUrl);
      

4. Práticas de implementação e testes

Como validar tudo de forma segura e eficiente:

  • Configure ambientes sandbox/dev no provedor OAuth escolhido.
  • Teste a troca de código por tokens com curl ou ferramentas como Postman/Insomnia.
  • Valide tokens recebidos: verifique assinatura (JWK), claims como iss, aud, exp, e escopo concedido.
  • Implemente validação de state para CSRF, use PKCE com código_verifier correspondente, e mantenha as rotas de callback protegidas.
  • Adote práticas de segurança: TLS, armazenamento seguro de tokens, rotação de tokens, e políticas de revogação.

Concluindo

Este guia apresenta os fundamentos e uma abordagem prática para começar com OAuth 2.0 do zero, com foco em segurança e clareza. Explore os tópicos avançados conforme avançar em seus projetos.

Para ampliar seu conhecimento, leia também:

© 2026 Yurideveloper. Todos os direitos reservados.