Como aprender OAuth 2.0 do zero — passo a passo
Guia técnico, direto ao ponto: fundamentos, fluxos, implementação prática e validação.
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
- Registre o client no Authorization Server (informando redirecionamento seguro e tipo de client).
- Escolha o fluxo Authorization Code com PKCE para clientes públicos.
- Gere um code_verifier aleatório e derive code_challenge via SHA-256 (PKCE).
- Construa a URL de autorização com: response_type=code, client_id, redirect_uri, scope, state, code_challenge e code_challenge_method=S256.
- Redirecione o usuário para o Authorization Server e receba o código na redirect_uri; valide o state para evitar CSRF.
- 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).
- Receba access_token (e, se suportado, refresh_token e id_token para OpenID Connect).
- Valide tokens: verifique assinatura, issuer (iss), audience (aud) e expiração (exp); trate o refresh conforme necessário.
- 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:
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!