שְׁלוּחוֹ שֶׁל אָדָם כְּמוֹתוֹ shelucho shel adam kemoto · o enviado de uma pessoa é como ela própria · Kidushin 41b

Blog/Artigos · Segurança

OAuth 2.0 e OIDC: o enviado tem a autoridade de quem o enviou

Autorização delegada, o token que carrega poder, PKCE e a diferença entre provar identidade e conceder acesso, com Okta, Auth0 e Keycloak.

Por Juliano Vince de Campos · · 5 min de leitura · 4 seções · 4 figuras

שָׁלִיחַ SHELUCHO · KIDUSHIN 41B

O Talmud firma um princípio que a lei usa até hoje: o enviado de uma pessoa é como ela própria; o que o shaliach faz dentro do mandato vale como se o mandante tivesse feito. Guarde a palavra mandato. OAuth 2.0 é esse princípio aplicado ao software: um aplicativo age em seu nome, com a autoridade que você delegou, dentro do escopo que você autorizou, e sem nunca receber a sua senha. O token é a carta selada que o enviado carrega, e entender o que está escrito nela é entender toda a segurança do fluxo.

Delegar acesso sem entregar a chave

Antes do OAuth, deixar um aplicativo agir por você significava dar a ele a sua senha, o equivalente a entregar a chave de casa para quem só precisava regar as plantas. OAuth 2.0, padronizado na RFC 6749, resolveu isso separando os papéis: você é o dono do recurso, o aplicativo é o cliente, e um servidor de autorização emite ao cliente um token com poder limitado, sem que a sua senha jamais passe por ele. O enviado recebe um mandato, não a sua identidade inteira.

O poder do token é limitado por escopo: ler o calendário, sim; apagar e-mails, não. Essa é a força do modelo e também sua armadilha, porque o escopo amplo demais é a chave de casa disfarçada de mandato de regar planta. Okta, Auth0 e Keycloak implementam o padrão, mas quem define o escopo é quem desenha a integração, e escopo largo concedido por conveniência é o erro mais comum que eu encontro em revisão.

Figura 1Os quatro papéis do OAuth 2.0
  • RODono do recursovocê, que autoriza o acesso ao que é seu
  • ClientAplicação clienteo enviado que quer agir em seu nome, dentro do mandato
  • ASServidor de autorizaçãoquem emite o token após você consentir: Okta, Auth0, Keycloak
  • RSServidor de recursoa API que guarda o recurso e confia no token apresentado
Separar dono, cliente, emissor e recurso é o que permite delegar poder sem compartilhar credencial. Cada papel confia no token, não na senha.

OAuth autoriza, OIDC identifica

Aqui mora a confusão mais cara do mercado: OAuth 2.0 é sobre autorização, não sobre identidade. O access token diz o que o portador pode fazer, não quem ele é, e usar access token como prova de login é a origem de uma classe inteira de vulnerabilidades. Foi para preencher essa lacuna que a OpenID Foundation criou o OpenID Connect (OIDC), uma camada de identidade sobre o OAuth 2.0.

OIDC acrescenta o id_token, um JWT assinado que afirma quem é o usuário, quando e como ele autenticou, e para qual cliente aquele token foi emitido. A carta do enviado passa a ter duas partes: uma diz o que ele pode (access token, do OAuth), outra diz de quem ele vem (id_token, do OIDC). Confundir as duas é entregar o mandato para o portador errado.

Figura 2OAuth 2.0 e OIDC: o que cada um resolve
PerguntaOAuth 2.0OpenID Connect
O que respondeo que o cliente pode fazerquem é o usuário autenticado
Token principalaccess tokenid_token (JWT assinado)
Camadaautorizaçãoidentidade sobre o OAuth 2.0
Erro comumescopo largo demaisusar access token como prova de login
OIDC não substitui OAuth, ele o completa. Login usa OIDC; acesso a recurso usa OAuth. Trocar um pelo outro é a raiz de brechas conhecidas.

O fluxo certo: Authorization Code com PKCE

Dos fluxos do OAuth, o Authorization Code é o recomendado, e o Implicit foi aposentado justamente por expor o token. Mas o Authorization Code puro tinha um flanco em aplicações públicas, como mobile e SPA, onde o segredo do cliente não pode ser guardado: um atacante que interceptasse o código de autorização poderia trocá-lo por um token. PKCE, a RFC 7636, fechou esse flanco e hoje é obrigatório na prática.

PKCE funciona como um selo que só o remetente original consegue reproduzir: o cliente gera um segredo aleatório, envia o hash dele ao pedir o código e revela o segredo original ao trocar o código pelo token. Quem interceptou o código não tem o segredo, então a troca falha. No PicPay eu redesenhei a autenticação mobile com OAuth 2.0 e PKCE exatamente por isso, eliminando o token de longa duração que era o ativo mais visado.

Figura 3Authorization Code com PKCE, o selo que o interceptador não reproduz
  1. 01Gera o verificadoro cliente cria um segredo aleatório e o hash dele (challenge)
  2. 02Pede autorizaçãoenvia o challenge; o usuário consente no servidor de autorização
  3. 03Recebe o códigoum código de uso único volta para o cliente
  4. 04Troca com o verificadorrevela o segredo original; sem ele, a troca falha
  5. 05Recebe os tokensaccess token e, com OIDC, id_token, com escopo e prazo

O código interceptado é inútil sem o verificador original. O selo prova que quem troca é quem pediu.

Authorization Code com PKCE é o fluxo padrão para web, mobile e SPA. Implicit está aposentado; quem ainda o usa herdou uma brecha conhecida.

Onde os fluxos vazam, e como operar com segurança

Os erros que viram incidente são conhecidos e repetidos: redirect_uri sem validação estrita, que permite roubar o código; access token de vida longa, que amplia a janela de estrago; refresh token sem rotação, que vira credencial permanente; e ausência de validação de audiência, que faz um recurso aceitar token emitido para outro. Cada um é o enviado entregando a carta a quem não devia.

A operação segura inverte cada erro: redirect exato e pré-registrado, access token curto com refresh rotativo, validação de assinatura, emissor e audiência em todo recurso, e revogação central quando algo dá errado. Delegar poder ao enviado é eficiente e correto, desde que o mandato seja estreito, curto e verificável, e que a carta só valha nas mãos certas.

Figura 4Erros de OAuth/OIDC por gravidade e frequência
Gravidade se explorado
redirect_uri frouxopermite roubar o código de autorização; corrigir primeiro
Access token de vida longaamplia a janela de estrago de um token vazado
Refresh sem rotaçãotoken virtualmente permanente se roubado
Audiência não validadarecurso aceita token emitido para outro
Frequência com que aparece
Os dois de cima são graves e comuns: é onde a revisão de uma integração OAuth deve começar antes de qualquer refinamento.

Para levar

OAuth 2.0 e OIDC fazem o enviado agir com a autoridade de quem o enviou, sem receber a chave inteira: OAuth concede acesso por escopo, OIDC prova identidade, e o Authorization Code com PKCE garante que a carta só valha nas mãos certas. Okta, Auth0 e Keycloak são o instrumento; RFC 6749, OIDC e PKCE são a lei. A IA revisa escopo, detecta o antipadrão e testa os cantos, mas desenhar um mandato estreito e verificável continua sendo trabalho de arquitetura.

Tags

  • #julianovincedecampos
  • #Oauth20
  • #OIDC
  • #Autenticação
  • #Autorização
  • #PKCE
  • #SSO

Onde eu estudei, me certifiquei e trabalhei

  • University of Cambridge
  • PUC Minas
  • PUC-RS
  • PUC Goiás
  • Pontificia Universidad Católica del Perú
  • Amazon Web Services
  • Google
  • IBM
  • Oracle
  • COBIT 5 Foundation
  • ITIL v3 Foundation
  • Exemplar Global
  • Red Team Leaders
  • Infosec
  • Salesforce
  • Flowgrammers
  • ISO/IEC 27001
  • NIST Cybersecurity Framework
  • Compass UOL
  • Luby
  • Creditas
  • PicPay
  • PagoNxt, Santander
  • Mercado Pago
  • Itaú Unibanco
  • Foursys
  • Soluti Certificação Digital