Authentication

OpenID Connect

OAuth 2.0 autoriza el acceso; OpenID Connect añade la capa de identidad que permite iniciar sesión a los usuarios. Es el protocolo detrás del botón 'Iniciar sesión con...'.

intermediate15 min readUpdated 20 sept 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",
});
Basado en
OAuth 2.0
Artefacto principal
ID token (JWT)
Flujo principal
Authorization code + PKCE
Discovery
/.well-known/openid-configuration
Claves
JWKS endpoint
Llamada opcional
UserInfo endpoint

Por que importa

Qué añade OpenID Connect

Autenticación real

OAuth otorga acceso a recursos; OIDC prueba la identidad. El ID token es una declaración firmada de que el usuario se autenticó con el proveedor.

Un login, muchas apps

El mismo proveedor puede iniciar sesión a los usuarios en cada aplicación de una organización, que es como funciona el single sign-on en la práctica.

Estándar y verificable

Los documentos de discovery y las claves publicadas permiten que los clientes validen tokens sin necesidad de código personalizado y específico del proveedor.

La imagen completa

Las tres piezas móviles de un login

El proveedor autentica al usuario, el ID token afirma quién es, y el cliente lo valida antes de confiar en cualquier dato.

ID token

Afirmar

Un JWT que contiene el subject, issuer, audience y expiry, firmado por el proveedor y verificado por el cliente.

Authorization code

Intercambiar

El navegador recibe un código de corta duración, y el backend lo intercambia por tokens para que las credenciales nunca lleguen al canal frontal.

Validación

Confiar

Verificar la firma contra el JWKS del proveedor, y luego validar el issuer, audience y expiry antes de leer cualquier claim.

HTML5 de un vistazo

Los componentes de OIDC

Discovery

Un documento well-known que enumera los endpoints y las funcionalidades soportadas.

ID token

Un JWT firmado que describe quién acaba de iniciar sesión.

PKCE

Un secreto por solicitud que protege el intercambio de códigos para clientes públicos.

Access token

Una credencial para llamar a APIs, separada de la afirmación de identidad.

UserInfo

Un endpoint que devuelve claims del perfil para el access token.

JWKS

Las claves públicas del proveedor, obtenidas y almacenadas en caché para la verificación.

Flujo

El authorization code flow con PKCE

El navegador solo ve un código. Los tokens se intercambian en el backend, donde residen el client secret y el code verifier.

  1. 1

    Iniciar el login

    El cliente genera un code verifier y un challenge, y luego redirige el navegador al authorization endpoint del proveedor con el scope openid.

  2. 2

    Autenticar

    El usuario inicia sesión en el proveedor, que es la única parte que ve la contraseña o el segundo factor.

  3. 3

    Recibir el código

    El proveedor redirige de vuelta a la redirect URI registrada del cliente con un authorization code de corta duración.

  4. 4

    Intercambiar el código

    El backend envía el código y el verifier al token endpoint y recibe un ID token, un access token y, opcionalmente, un refresh token.

  5. 5

    Validar el ID token

    Verificar la firma contra el JWKS, y luego comprobar iss, aud, exp y nonce antes de confiar en cualquier claim.

  6. 6

    Establecer una sesión

    Crear tu propia sesión o token a partir del subject verificado. OIDC autentica; no reemplaza tu modelo de sesión.

Una breve historia

Del acceso delegado al login federado

  1. 2012

    Lanzamiento de OAuth 2.0

    El RFC 6749 estandariza la autorización delegada, pero no menciona nada sobre la identidad.

    12
  2. 2014

    OpenID Connect 1.0

    Se añade una capa ligera de identidad sobre OAuth, definiendo el ID token y el discovery.

    14
  3. 2015

    El ID token es un JWT

    JWT se convierte en el formato de token y los proveedores de identidad convergen en él.

    15
  4. 2019

    PKCE recomendado en todas partes

    La Security Best Current Practice de OAuth 2.0 extiende PKCE a los clientes confidenciales.

    19
  5. Hoy

    El estándar para el login

    Los botones de "Iniciar sesión con..." y el SSO empresarial son OIDC disfrazado.

    Hoy

La guia completa

OpenID Connect: Todo lo que necesitas saber

OAuth es autorización, OIDC es autenticación

OAuth 2.0 responde a una sola pregunta: ¿puede esta aplicación actuar en nombre de este usuario? Para ello, emite access tokens para APIs. Deliberadamente, no dice nada sobre quién es el usuario. Ese vacío causó años de confusión, y OpenID Connect es la solución.

OpenID Connect es una pequeña capa de identidad sobre OAuth 2.0. Estandariza el flujo de inicio de sesión, define un ID token que certifica la identidad y publica metadatos para que los clientes puedan configurarse sin adivinanzas. Cuando haces clic en “Iniciar sesión con Google” o en un botón de SSO empresarial, estás utilizando OIDC.

La regla práctica: si necesitas saber quién es el usuario, usa OIDC. Si necesitas que una aplicación haga algo en su nombre, usa OAuth. La mayoría de los inicios de sesión requieren ambos, razón por la cual generalmente se implementan juntos.

El ID token

La pieza central de OIDC es el ID token: un JWT firmado por el proveedor de identidad. Este contiene los claims que tu aplicación necesita para establecer una sesión.

  • sub — el identificador único y estable del usuario.
  • iss — el issuer, para que sepas qué proveedor lo firmó.
  • aud — el client id para el cual fue emitido; un token destinado a otra aplicación debe ser rechazado.
  • exp y iat — cuándo expira y cuándo fue emitido.
  • nonce — refleja el valor que enviaste, para vincular el token a este intento de inicio de sesión.
  • email, name, picture — claims de perfil, siempre que los scopes solicitados lo permitan.

El ID token es para tu client. No es la credencial que envías a las APIs downstream; esa es la función del access token. Mantener ambos conceptos separados evita un error de diseño muy común.

Discovery

Cada proveedor compatible publica un documento de discovery:

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

Este documento enumera los endpoints de autorización, token, userinfo y JWKS, además de los scopes y algoritmos soportados. Los clientes lo obtienen al iniciar y se configuran automáticamente, evitando así el hard-coding y permitiendo que los cambios del proveedor se apliquen de forma automática.

El flujo de código de autorización con PKCE

El flujo recomendado evita que las credenciales lleguen al navegador. El navegador solo maneja un código de corta duración.

  1. El cliente genera un code_verifier aleatorio, lo transforma mediante un hash en un code_challenge y redirige el navegador al proveedor con scope=openid.
  2. El usuario se autentica en el proveedor; este es el único lugar donde se introduce una contraseña o un segundo factor.
  3. El proveedor redirige de vuelta con un code de autorización.
  4. El backend intercambia el código, junto con el verificador, por un ID token y un access token.
  5. El cliente valida el ID token y crea una sesión.

PKCE (Proof Key for Code Exchange) vincula el código al cliente que lo solicitó. Un código interceptado durante el tránsito es inútil sin el verificador. Envía siempre state para prevenir CSRF y nonce para vincular el ID token a la solicitud.

Scopes y claims

Los scopes deciden qué claims puedes recibir.

  • openid — obligatorio; sin él, la solicitud es OAuth simple, no OIDC.
  • profile — nombre, foto y otros campos del perfil.
  • email — el email del usuario y si está verificado.
  • offline_access — solicita un refresh token para que la aplicación pueda actuar posteriormente.

Solicita solo lo mínimo necesario. Cada scope adicional implica más datos que proteger y, en algunos proveedores, genera más fricción en el consentimiento para el usuario.

El endpoint userinfo

El ID token a menudo contiene solo la información básica. Para obtener más datos del perfil, llama al endpoint userinfo utilizando el access token:

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

Trata el sub de userinfo como la fuente autorizada y asegúrate de que coincida con el sub del ID token. Nunca confíes en un email como un identificador estable, ya que los usuarios pueden cambiarlos.

Validando el ID token

La validación es el paso que hace que todo el proceso sea seguro, y es el paso que más a menudo se hace mal. Decodificar el payload no es lo mismo que verificarlo; cualquier persona puede crear un token con cualquier claim.

Antes de confiar en un claim:

  1. Signature — verifícalo con la clave pública del proveedor desde el endpoint JWKS, utilizando un algoritmo permitido.
  2. Issueriss debe ser igual al proveedor esperado.
  3. Audienceaud debe ser tu client id.
  4. Expiryexp debe ser una fecha futura, considerando un pequeño margen de error del reloj (clock skew).
  5. Nonce — debe coincidir con el valor que enviaste para este login.

Utiliza una librería mantenida como openid-client y deja que ella se encargue de estos cinco puntos. No intentes implementar el parsing de JWT a mano para la autenticación.

Sesiones después del login

OIDC autentica una sola vez, al iniciar sesión. No gestiona la sesión de tu aplicación. Después de validar el ID token, crea tu propia sesión —ya sea una cookie o un token— basada en sub.

Ten claras estas tres cosas:

  • El ID token es para tu cliente y sirve para probar la identidad.
  • El access token es para realizar llamadas a APIs.
  • Tu sesión es la forma en que tu app recuerda al usuario a través de las solicitudes.

Mezclarlos provoca que los tokens del proveedor se filtren al navegador o que se utilice un ID token como credencial de API; ambos son errores.

Cerrar sesión

El cierre de sesión local es lo primero: limpia tu sesión para que el usuario quede desconectado de tu aplicación. Esto siempre está bajo tu control y es totalmente fiable.

El cierre de sesión federado es un proceso de “mejor esfuerzo” (best-effort). Puedes redirigir al endpoint de finalización de sesión del proveedor con un id_token_hint, pero no todos los proveedores lo respetan y es posible que la redirección no se complete. Diseña tu flujo de modo que limpiar tu propia sesión sea suficiente, y nunca dependas del proveedor para cerrar la sesión del usuario.

Cuándo usar OIDC

OIDC es la opción adecuada cuando:

  • Quieres evitar almacenar contraseñas por completo.
  • Necesitas SSO empresarial o botones de “Iniciar sesión con…”.
  • Tu aplicación es una de varias que deben compartir un mismo inicio de sesión.
  • Quieres que un especialista gestione el MFA y la recuperación de cuentas.

Es más complejo que un simple formulario de contraseña. Para una herramienta interna pequeña con unos pocos usuarios, Session Auth y Password Hashing pueden ser más sencillos y totalmente suficientes.

Mejores prácticas

  • Utiliza siempre el flujo de código de autorización con PKCE.
  • Envía y verifica tanto state como nonce.
  • Valida el ID token por completo: firma, emisor, audiencia y expiración.
  • Utiliza discovery en lugar de endpoints hard-coded.
  • Solicita los scopes mínimos necesarios.
  • Mantén tu sesión separada de los tokens del proveedor.
  • Almacena los client secrets en el backend, nunca en el navegador.

Errores comunes

  • Tratar OAuth como autenticación y leer la identidad desde un access token.
  • Decodificar el ID token sin verificar su firma.
  • Omitir las comprobaciones de aud o iss, permitiendo que se acepte un token de otra aplicación.
  • Utilizar el implicit flow y exponer los tokens en la URL.
  • Confiar en la dirección de correo electrónico como la primary key del usuario.
  • Enviar tokens del proveedor a tus propias APIs como si fueran credenciales de sesión.
  • Olvidar que el logout debe cerrar primero tu sesión.

Próximos pasos

Si aún no lo has leído, comienza con OAuth 2.0 para entender el protocolo de autorización que extiende OIDC, y la guía de JWT para conocer el formato de los tokens. Una vez que el login sea exitoso, la guía de Session Auth muestra cómo mantener al usuario autenticado, y RBAC & Permissions cubre qué acciones tienen permitido realizar.

En la practica

Un login en cuatro partes

El discovery elimina las URLs hard-coded, la URL de autorización inicia el flujo, y el callback intercambia y valida.

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

Eligiendo el flujo

Usa el authorization code flow con PKCE. Los grants de implicit y password filtran tokens a través del navegador y están 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

Confiar en el ID token

Valida cada token contra las claves publicadas y los valores esperados. Decodificar un JWT no es lo mismo que verificarlo.

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

Compromisos

¿Deberías construir tu login sobre OIDC?

OIDC elimina la gestión de contraseñas y habilita el SSO, a cambio de una dependencia externa y un protocolo que conviene entender antes de implementarlo.

Strengths

  • Sin contraseñas que almacenar

    El proveedor gestiona las credenciales, el MFA y la recuperación, por lo que tu aplicación nunca ve ni hashea una contraseña.

  • Single sign-on gratuito

    Los usuarios inician sesión una vez y acceden a todas las apps conectadas, y los clientes empresariales obtienen el SSO que esperan.

  • Estándar y portable

    Discovery y JWKS significan que el mismo código funciona con muchos proveedores, y cambiar de proveedor es una cuestión de configuración más que de reescritura.

Trade-offs

  • Heredas la disponibilidad del proveedor

    Si el proveedor de identidad cae, nadie puede iniciar sesión, así que trátalo como una dependencia crítica y monitorízalo.

  • Fácil de validar incorrectamente

    Decodificar un token sin comprobar la firma, el issuer o la audience es una vulnerabilidad real que aparece en producción.

  • Más piezas móviles

    Redirecciones, state, nonce, PKCE e intercambio de tokens son más cosas que configurar correctamente que una cookie de sesión y un formulario de contraseña.

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender OpenID Connect?

Nuestro tutorial interactivo te guia a traves de OpenID Connect paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.