OAuth2 e OIDC do zero: fluxos e PKCE
⏱ 15 min·⭐ 65 XP
Pré-requisitos (0/1)0%
- ⬜🔑 Authn vs Authz: a diferença e as armadilhas(Security Engineering)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Os 4 fluxos que importam em 2026
| Fluxo | Quando usar | Status |
|---|---|---|
| Authorization Code + PKCE | Web app, SPA, mobile (qualquer user-facing) | ✅ Obrigatório |
| Client Credentials | Backend-to-backend (M2M) | ✅ OK |
| Device Code | CLI, Smart TV, dispositivos sem browser | ✅ OK |
| Refresh Token (com rotation) | Renovar access token sem novo login | ✅ Com cuidado |
| Implicit | Legacy SPA pré-PKCE | ❌ Deprecated |
| ROPC (Password) | Só pra migrar de sistemas legados | ❌ Crime em 2026 |
FluxoAuthorization Code + PKCE
Quando usarWeb app, SPA, mobile (qualquer user-facing)
Status✅ Obrigatório
FluxoClient Credentials
Quando usarBackend-to-backend (M2M)
Status✅ OK
FluxoDevice Code
Quando usarCLI, Smart TV, dispositivos sem browser
Status✅ OK
FluxoRefresh Token (com rotation)
Quando usarRenovar access token sem novo login
Status✅ Com cuidado
FluxoImplicit
Quando usarLegacy SPA pré-PKCE
Status❌ Deprecated
FluxoROPC (Password)
Quando usarSó pra migrar de sistemas legados
Status❌ Crime em 2026
OIDC: o id_token
// id_token decoded (JWT)
{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334", // user ID único no issuer
"aud": "abc.apps.googleusercontent.com", // seu client_id
"exp": 1735689600,
"iat": 1735686000,
"email": "user@example.com",
"email_verified": true,
"name": "Ana Silva",
"picture": "https://..."
}Validar id_token: verificar assinatura com JWKS (endpoint público do issuer), iss bate, aud é seu client_id, exp no futuro, nonce bate se você enviou. Lib: jose (TS/JS).
Quiz rápido
Por que o fluxo de código de autorização com verificação por desafio é o recomendado até para aplicações com segredo?
Device Code — CLI login
# Ex: "gh auth login" faz isso
CLI POST /device/authorize
Response: { device_code, user_code: "WGKP-QVNX", verification_uri }
CLI mostra: "Open https://github.com/login/device and enter WGKP-QVNX"
CLI faz polling em /token com device_code.
Quando user aprova no browser, /token retorna access_token.Implementação prática TS
import * as openid from 'openid-client';
// 1. Discovery
const issuer = await openid.Issuer.discover('https://accounts.google.com');
const client = new issuer.Client({
client_id: process.env.GOOGLE_CLIENT_ID!,
client_secret: process.env.GOOGLE_CLIENT_SECRET!,
redirect_uris: ['https://app.com/callback'],
response_types: ['code'],
});
// 2. Build authorize URL com PKCE
const codeVerifier = openid.generators.codeVerifier();
const codeChallenge = openid.generators.codeChallenge(codeVerifier);
const state = openid.generators.state();
const url = client.authorizationUrl({
scope: 'openid profile email',
code_challenge: codeChallenge,
code_challenge_method: 'S256',
state,
});
// 3. No callback: trocar code por tokens
const params = client.callbackParams(req);
const tokenSet = await client.callback(
'https://app.com/callback',
params,
{ code_verifier: codeVerifier, state }
);
// tokenSet.id_token (JWT), tokenSet.access_token
const claims = tokenSet.claims();⚠️
Nunca armazene em localStorage (XSS lê). Use httpOnly cookie pra refresh token, memória pra access token.
Perguntas frequentes
❓ Qual fluxo de OAuth usar hoje?
Código de autorização com verificação de chave por prova, para todo tipo de aplicação — inclusive as que rodam no navegador e no celular. Os outros fluxos foram depreciados por razões de segurança. Fluxo com token direto na URL não deve ser usado em projeto novo.
❓ Qual a diferença entre OAuth e OpenID Connect?
OAuth é autorização de acesso a recurso em nome do usuário; a camada de identidade por cima entrega quem o usuário é, num token de identidade. Usar token de acesso para saber a identidade é o mau uso clássico — ele não foi feito para isso e nem sempre carrega a informação.
❓ Para que serve a verificação por prova de chave?
Para impedir que um código de autorização interceptado seja trocado por token por outro aplicativo: quem inicia o fluxo prova, no fim, que era o mesmo. É o que torna o fluxo seguro em cliente que não consegue guardar segredo, como aplicativo e página.
Fixando
Quiz rápido
Qual é a diferença entre o token de acesso e o token de identidade?
Quiz rápido
Para que serve o fluxo por código de dispositivo?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…