Error de inicio de sesión con autorización de GitHub: Causa raíz y solución del problema de "issuer" faltante o no coincidente
Proyectos que integran el inicio de sesión de GitHub con NextAuth.js (o Auth.js) experimentan errores frecuentes en la etapa de callback de autorización: "issuer validation failed".
Renderizando...
Recientemente, los proyectos que integran el inicio de sesión de GitHub con NextAuth.js (o Auth.js) han experimentado errores frecuentes en la etapa de devolución de llamada de autorización (comúnmente como `unexpected iss parameter`, `checks.state mismatch` o `issuer validation failed`). Este problema surge de un conflicto entre la actualización del protocolo de seguridad oficial de GitHub y el mecanismo de validación de la biblioteca de dependencia subyacente.
**Análisis de la Causa Raíz del Problema**
1. **Implementación de la Especificación de Defensa RFC 9207**: GitHub ha estado cumpliendo plenamente con **RFC 9207** (Especificación del Identificador de Emisor del Servidor de Autorización OAuth 2.0) en su flujo de autorización OAuth. Cuando el usuario es redirigido de vuelta a la aplicación después de una autorización exitosa, el parámetro de URL de devolución de llamada ahora incluye obligatoriamente el campo `iss` (por ejemplo, `?code=xxx&state=xxx&iss=[https://github.com/login/oauth](https://github.com/login/oauth)`), para prevenir ataques de mezcla OAuth (Mix-Up Attacks).
2. **Validación Estricta de `openid-client`**: NextAuth depende de `openid-client` para manejar la autenticación OAuth/OIDC. Cuando `openid-client` recibe el parámetro `iss` en la URL de devolución de llamada, exige que el `issuer` coincidente exista en la configuración del Proveedor y valida si sus valores son idénticos.
3. **Configuración Retrasada del Proveedor Incorporado**: Las definiciones de `GitHubProvider` preestablecidas en algunas versiones de NextAuth (especialmente v4 y versiones tempranas de v5) carecen de una declaración `issuer` predeterminada, lo que impide que `openid-client` complete la validación de coincidencia y genera una excepción directamente.
**Solución**
En el archivo de configuración de NextAuth, agregue explícitamente el parámetro `issuer` para `GitHubProvider` y asígnelo a `[https://github.com/login/oauth](https://github.com/login/oauth)`.
**Usando la Configuración `GithubProvider.default` (Común en Entornos Personalizados/En Tiempo de Ejecución):**
```TypeScript
import GithubProvider from "next-auth/providers/github";
GithubProvider.default({
clientId: runtimeConfig.github.clientId,
clientSecret: runtimeConfig.github.clientSecret,
// GitHub devuelve iss en la devolución de llamada según RFC 9207; openid-client requiere que coincida con issuer
issuer: "https://github.com/login/oauth",
httpOptions: {
timeout: 30000,
},
});
```
**Configuración Estándar Convencional (Exportación Predeterminada de NextAuth v4 / v5):**
```TypeScript
import GithubProvider from "next-auth/providers/github";
GithubProvider({
clientId: process.env.GITHUB_ID!,
clientSecret: process.env.GITHUB_SECRET!,
// Especifica explícitamente issuer para que coincida con el parámetro iss de la devolución de llamada
issuer: "https://github.com/login/oauth",
httpOptions: {
timeout: 30000,
},
});
```
**Consideraciones de Configuración**
* **Alineación Estricta del Formato de URL**: El `issuer` debe escribirse estrictamente como `[https://github.com/login/oauth](https://github.com/login/oauth)`, no se puede usar `[https://github.com](https://github.com)` o omitir la ruta, de lo contrario, la comparación de cadenas de `openid-client` seguirá fallando.
* **Configuración de Tiempo de Espera de Red**: Mantener `httpOptions: { timeout: 30000 }` puede evitar tiempos de espera de solicitud debido a la lenta respuesta de la API OAuth de GitHub en funciones sin servidor (como Vercel/Cloudflare Workers) o entornos de red restringidos.
* **Recomendaciones de Actualización Futura**: Este cambio es una solución temporal de anulación explícita para ser compatible con RFC 9207 de GitHub. Después de actualizar NextAuth / `@auth/core` a una versión que corrija la definición predeterminada de este Proveedor, puede evaluar si eliminar esta configuración manual según el registro de cambios.Comentario
Inicia sesión para ver y publicar comentarios
Ir a iniciar sesión