Authentication

OpenID Connect

OAuth 2.0 autoriza o acesso; OpenID Connect adiciona a camada de identidade que permite autenticar usuários. É o protocolo por trás do botão 'Entrar com...'.

intermediate15 min readUpdated 20 de set. de 2026
oidc.js
js
// oidc.js
import { Issuer } from "openid-client";

const issuer = await Issuer.discover("https://accounts.example.com");
const client = new issuer.Client({
  client_id: process.env.OIDC_CLIENT_ID,
  client_secret: process.env.OIDC_CLIENT_SECRET,
  redirect_uris: ["https://app.example.com/callback"],
  response_types: ["code"],
});

export const loginUrl = client.authorizationUrl({
  scope: "openid profile email",
  code_challenge: challenge,
  code_challenge_method: "S256",
});
Baseado em
OAuth 2.0
Artefato principal
ID token (JWT)
Fluxo principal
Authorization code + PKCE
Discovery
/.well-known/openid-configuration
Chaves
JWKS endpoint
Chamada opcional
UserInfo endpoint

Por que importa

O que o OpenID Connect adiciona

Autenticação real

OAuth concede acesso a recursos; OIDC prova a identidade. O ID token é uma declaração assinada de que o usuário se autenticou com o provedor.

Um login, muitos apps

O mesmo provedor pode autenticar usuários em todos os apps de uma organização, que é como o single sign-on funciona na prática.

Padronizado e verificável

Documentos de discovery e chaves publicadas significam que os clientes validam tokens sem a necessidade de código customizado e específico do provedor.

O panorama completo

As três partes móveis de um login

O provedor autentica o usuário, o ID token afirma quem ele é, e o cliente o valida antes de confiar em qualquer coisa.

ID token

Afirmar

Um JWT que carrega o subject, issuer, audience e expiração, assinado pelo provedor e verificado pelo cliente.

Authorization code

Trocar

O navegador recebe um código de curta duração, e o backend o troca por tokens para que as credenciais nunca cheguem ao front channel.

Validação

Confiar

Verifique a assinatura contra o JWKS do provedor, então fixe o issuer, audience e expiração antes de ler qualquer claim.

HTML5 de uma olhada

As peças do OIDC

Discovery

Um documento well-known que lista os endpoints e as funcionalidades suportadas.

ID token

Um JWT assinado descrevendo quem acabou de fazer login.

PKCE

Um segredo por requisição que protege a troca de código para clientes públicos.

Access token

Uma credencial para chamar APIs, separada da afirmação de identidade.

UserInfo

Um endpoint que retorna claims de perfil para o access token.

JWKS

As chaves públicas do provedor, buscadas e cacheadas para verificação.

Fluxo

O authorization code flow com PKCE

O navegador apenas vê um código. Os tokens são trocados no backend, onde residem o client secret e o code verifier.

  1. 1

    Iniciar o login

    O cliente gera um code verifier e um challenge, então redireciona o navegador para o authorization endpoint do provedor com o scope openid.

  2. 2

    Autenticar

    O usuário faz login no provedor, que é a única parte que vê a senha ou o segundo fator.

  3. 3

    Receber o código

    O provedor redireciona de volta para a redirect URI registrada do cliente com um authorization code de curta duração.

  4. 4

    Trocar o código

    O backend envia o código e o verifier para o token endpoint e recebe um ID token, um access token e, opcionalmente, um refresh token.

  5. 5

    Validar o ID token

    Verifique a assinatura contra o JWKS, então cheque iss, aud, exp e nonce antes de confiar em qualquer claim.

  6. 6

    Estabelecer uma sessão

    Crie sua própria sessão ou token a partir do subject verificado. O OIDC autentica; ele não substitui seu modelo de sessão.

Uma breve historia

Do acesso delegado ao login federado

  1. 2012

    Lançamento do OAuth 2.0

    A RFC 6749 padroniza a autorização delegada, mas não menciona identidade.

    12
  2. 2014

    OpenID Connect 1.0

    Uma camada fina de identidade é adicionada ao OAuth, definindo o ID token e o discovery.

    14
  3. 2015

    O ID token passa a ser um JWT

    JWT torna-se o formato de token, e os provedores de identidade convergem para ele.

    15
  4. 2019

    PKCE recomendado para todos

    O OAuth 2.0 Security Best Current Practice estende o PKCE para clientes confidenciais.

    19
  5. Hoje

    O padrão para login

    Botões de "Entrar com..." e SSO corporativo são OIDC disfarçados.

    Hoje

O guia completo

OpenID Connect: Tudo que voce precisa saber

OAuth é autorização, OIDC é autenticação

O OAuth 2.0 responde a apenas uma pergunta: esta aplicação pode agir em nome deste usuário? Ele fornece access tokens para APIs. Deliberadamente, ele não diz nada sobre quem é o usuário. Essa lacuna causou anos de confusão, e o OpenID Connect é a solução.

O OpenID Connect é uma pequena camada de identidade sobre o OAuth 2.0. Ele padroniza o fluxo de login, define um ID token que atesta a identidade e publica metadados para que os clientes possam ser configurados sem adivinhações. Quando você clica em “Fazer login com o Google” ou em um botão de SSO corporativo, você está usando OIDC.

A regra prática: se você precisa saber quem é o usuário, use OIDC. Se você precisa que um app faça algo em nome dele, use OAuth. A maioria dos logins precisa de ambos, e é por isso que os dois geralmente são implementados juntos.

O ID token

A peça central do OIDC é o ID token: um JWT assinado pelo provedor de identidade. Ele carrega as claims que sua aplicação precisa para estabelecer um login.

  • sub — o identificador estável e único do usuário.
  • iss — o emissor, para que você saiba qual provedor o assinou.
  • aud — o client id para o qual ele foi emitido; um token para outro app deve ser rejeitado.
  • exp e iat — quando ele expira e quando foi emitido.
  • nonce — reflete o valor que você enviou, para vincular o token a esta tentativa de login.
  • email, name, picture — claims de perfil, quando os scopes solicitados as permitem.

O ID token é para o seu client. Ele não é a credencial que você envia para APIs downstream — esse é o trabalho do access token. Manter os dois distintos evita um erro comum de design.

Discovery

Todo provedor compatível publica um documento de discovery:

https://accounts.example.com/.well-known/openid-configuration

Ele lista os endpoints de autorização, token, userinfo e JWKS, além dos scopes e algoritmos suportados. Os clientes buscam esse documento na inicialização e se autoconfiguram, garantindo que nada seja hard-coded e que as mudanças no provedor sejam detectadas automaticamente.

O fluxo de código de autorização com PKCE

O fluxo recomendado mantém as credenciais fora do navegador. O navegador lida apenas com um código de curta duração.

  1. O cliente gera um code_verifier aleatório, cria o hash para transformá-lo em um code_challenge e redireciona o navegador para o provedor com scope=openid.
  2. O usuário se autentica no provedor — o único lugar onde uma senha ou segundo fator é inserido.
  3. O provedor redireciona de volta com um code de autorização.
  4. O backend troca o código, junto com o verifier, por um ID token e um access token.
  5. O cliente valida o ID token e cria uma sessão.

O PKCE (Proof Key for Code Exchange) vincula o código ao cliente que o solicitou. Um código interceptado durante o trânsito é inútil sem o verifier. Sempre envie state para prevenir CSRF e nonce para vincular o ID token à requisição.

Escopos e claims

Os escopos decidem quais claims você pode receber.

  • openid — obrigatório; sem ele, a requisição é um OAuth simples, não OIDC.
  • profile — nome, foto e outros campos de perfil.
  • email — o e-mail do usuário e se ele está verificado.
  • offline_access — solicita um refresh token para que o app possa agir posteriormente.

Peça apenas o mínimo necessário. Cada escopo extra representa mais dados para proteger e, para alguns provedores, gera mais fricção no consentimento do usuário.

O endpoint userinfo

O ID token geralmente carrega apenas as informações básicas. Para obter mais dados do perfil, chame o endpoint userinfo utilizando o access token:

const userinfo = await client.userinfo(tokenSet.access_token);
// { sub, name, email, email_verified, picture, ... }

Trate o sub do userinfo como a fonte oficial e certifique-se de que ele corresponde ao sub no ID token. Nunca confie em um e-mail como um identificador estável — as pessoas os alteram.

Validando o ID token

A validação é a etapa que torna todo o processo seguro, e também a etapa que mais frequentemente é feita de forma errada. Decodificar o payload não é o mesmo que verificar; qualquer pessoa pode criar um token com quaisquer claims.

Antes de confiar em uma claim:

  1. Assinatura (Signature) — verifique-a com a chave pública do provedor a partir do endpoint JWKS, utilizando um algoritmo permitido.
  2. Emissor (Issuer)iss deve ser igual ao provedor esperado.
  3. Audiência (Audience)aud deve ser o seu client id.
  4. Expiração (Expiry)exp deve estar no futuro, considerando uma pequena margem de erro no relógio (clock skew).
  5. Nonce — deve corresponder ao valor que você enviou para este login.

Use uma biblioteca mantida, como openid-client, e deixe que ela realize essas cinco etapas. Não tente implementar o parsing de JWT manualmente para autenticação.

Sessões após o login

O OIDC autentica apenas uma vez, no momento do login. Ele não gerencia a sessão da sua aplicação. Após validar o ID token, crie sua própria sessão — um cookie ou um token — baseada no sub.

Mantenha estes três conceitos distintos:

  • O ID token é para o seu cliente e comprova a identidade.
  • O access token serve para realizar chamadas a APIs.
  • A sua sessão é a forma como sua aplicação lembra do usuário entre as requisições.

Misturá-los pode levar ao vazamento de tokens do provedor para o navegador ou ao uso de um ID token como credencial de API, sendo ambos erros graves.

Logout

O logout local vem primeiro: limpe a sua sessão para que o usuário seja desconectado do seu app. Isso está sempre sob seu controle e é sempre confiável.

O logout federado funciona no modelo “best-effort”. Você pode redirecionar para o endpoint de encerramento de sessão do provedor com um id_token_hint, mas nem todo provedor o respeita e o redirecionamento pode não ser concluído. Projete seu sistema de forma que a limpeza da sua própria sessão seja suficiente, e nunca dependa do provedor para desconectar o usuário.

Quando usar OIDC

O OIDC é a escolha certa quando:

  • Você deseja evitar completamente o armazenamento de senhas.
  • Você precisa de SSO corporativo ou botões de “Entrar com…”.
  • Você possui um de vários apps que devem compartilhar o mesmo login.
  • Você quer que o MFA e a recuperação de conta sejam gerenciados por um especialista.

Ele é mais robusto do que um formulário de senha simples. Para uma ferramenta interna pequena com poucos usuários, Session Auth e Password Hashing podem ser mais simples e inteiramente suficientes.

Melhores práticas

  • Use sempre o fluxo de código de autorização (authorization code flow) com PKCE.
  • Envie e verifique tanto o state quanto o nonce.
  • Valide completamente o ID token — assinatura, emissor (issuer), audiência (audience) e expiração.
  • Utilize discovery em vez de endpoints fixos no código.
  • Solicite apenas os scopes mínimos necessários.
  • Mantenha a sua sessão separada dos tokens do provedor.
  • Armazene os client secrets no backend, nunca no navegador.

Erros comuns

  • Tratar OAuth como autenticação e ler a identidade a partir de um access token.
  • Decodificar o ID token sem verificar sua assinatura.
  • Pular as verificações de aud ou iss, fazendo com que um token de outro app seja aceito.
  • Usar o implicit flow e expor tokens na URL.
  • Confiar no endereço de e-mail como a chave primária do usuário.
  • Enviar tokens do provedor para suas próprias APIs como se fossem credenciais de sessão.
  • Esquecer que o logout deve limpar a sua sessão primeiro.

Próximos passos

Se você ainda não leu, comece por OAuth 2.0 para entender o protocolo de autorização que o OIDC estende, e o guia de JWT para conhecer o formato do token. Assim que o login for bem-sucedido, o guia de Session Auth mostra como manter o usuário conectado, e RBAC & Permissions aborda o que eles têm permissão para fazer.

Na pratica

Um login em quatro partes

O discovery remove URLs hard-coded, a URL de autorização inicia o fluxo, e o callback troca e valida.

terminal
curl https://accounts.example.com/.well-known/openid-configuration
# { "issuer": "...", "authorization_endpoint": "...",
#   "token_endpoint": "...", "jwks_uri": "...", ... }

Escolhendo o fluxo

Use o authorization code flow com PKCE. Implicit e password grants vazam tokens através do navegador e estão obsoletos.

Preferir
GET /authorize?response_type=code
  &code_challenge=...&code_challenge_method=S256
Evitar
GET /authorize?response_type=token
# token returned in the URL fragment

Confiando no ID token

Valide cada token contra as chaves publicadas e os valores esperados. Decodificar um JWT não é o mesmo que verificá-lo.

Preferir
// verify signature, iss, aud, exp, nonce
const claims = tokenSet.claims();
Evitar
const claims = JSON.parse(
  Buffer.from(idToken.split(".")[1], "base64url"),
);

Trade-offs

Você deve construir seu login com OIDC?

O OIDC remove a manipulação de senhas e libera o SSO, ao custo de uma dependência externa e um protocolo que vale a pena entender antes de implementar.

Strengths

  • Sem senhas para armazenar

    O provedor cuida das credenciais, MFA e recuperação, então sua aplicação nunca vê ou faz hash de uma senha.

  • Single sign-on gratuito

    Usuários fazem login uma vez e acessam todos os apps conectados, e clientes corporativos recebem o SSO que esperam.

  • Padronizado e portátil

    Discovery e JWKS significam que o mesmo código funciona com vários provedores, e trocar de provedor é uma questão de configuração, não de reescrita.

Trade-offs

  • Você herda a disponibilidade do provedor

    Se o provedor de identidade estiver fora do ar, ninguém consegue logar, então trate-o como uma dependência crítica e monitore-o.

  • Fácil de validar incorretamente

    Decodificar um token sem checar a assinatura, issuer ou audience é uma vulnerabilidade real que aparece em produção.

  • Mais partes móveis

    Redirects, state, nonce, PKCE e troca de tokens são mais coisas para acertar do que um cookie de sessão e um formulário de senha.

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender OpenID Connect?

Nosso tutorial interativo te guia por OpenID Connect passo a passo — com quizzes e codigo real que voce pode executar no navegador.