La configuración de autenticación en Next.js 16 puede dejarte expuesto si no se implementa de manera segura.

El truco

Antes (inseguro):

// pages/api/auth/[...nextauth].js
import NextAuth from "next-auth";
import Providers from "next-auth/providers";

export default NextAuth({
  providers: [
    Providers.GitHub({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  session: {
    jwt: true,
  },
});

Después (mejorado):

// pages/api/auth/[...nextauth].js
import NextAuth from "next-auth";
import Providers from "next-auth/providers";
import { createHash } from "crypto";

export default NextAuth({
  providers: [
    Providers.GitHub({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  session: {
    jwt: true,
    maxAge: 30 * 24 * 60 * 60, // 30 días
    updateAge: 24 * 60 * 60,  // Actualizar cada 24 horas
  },
  callbacks: {
    async session(session, token) {
      session.user.id = token.sub;
      return session;
    },
  },
  jwt: {
    secret: createHash('sha256').update(process.env.JWT_SECRET).digest('hex'),
  },
});

Asegúrate de proteger las sesiones de usuario configurando maxAge y updateAge adecuadamente para mitigar riesgos de sesión comprometida. Usa un secreto seguro para los JWT, en este ejemplo usando SHA-256 para crear un hash del secreto. La función session en callbacks añade el ID del usuario al objeto de la sesión, útil para realizar consultas posteriores en la base de datos.

La autenticación segura en Next.js comienza con una configuración robusta; no subestimes su importancia.