I am trying to make a simple login api, that works PERFECTLY on localhost.
My server is hosted on cpanel, and while Get routes works well, the login POST routes just get 404 error when I put my username and password.
Backend route.ts in api/auth/login/route.ts is:
export async function POST(req: NextRequest) {
console.log('POST en /api/auth/login'); // Log de prueba
try {
// Obtén los datos de la solicitud
const { name, password } = await req.json();
// Log de los datos recibidos
console.log('Datos recibidos en la API:', { name, password });
if (!name || !password) {
console.log('Credenciales incompletas');
return NextResponse.json({ message: 'Nombre de usuario y contraseña son obligatorios' }, { status: 400 });
}
// Intento de autenticación
const { user, token } = await authenticateUser(name, password);
// Log de lo que retorna la autenticación
console.log('Usuario autenticado:', user);
console.log('Token generado:', token);
return NextResponse.json({ user, token }, { status: 200 });
} catch (error) {
// Log de error si algo sale mal
console.log('Error durante la autenticación:', error);
return NextResponse.json({ message: error instanceof Error ? error.message : "Error desconocido" }, { status: 400 });
}
}
Auth.ts looks like this:
// Función para generar el token JWT
export const generateToken = async (userId: number): Promise<string> => {
console.log("Generando token para userId:", userId);
return new Promise((resolve, reject) => {
jwt.sign({ userId }, JWT_SECRET, { expiresIn: "1h" }, (err, token) => {
if (err) {
console.error("Error al generar token:", err);
reject(err);
} else {
console.log("Token generado correctamente:", token);
resolve(token as string);
}
});
});
};
export const authenticateUser = async (name: string, password: string) => {
try {
console.log("Iniciando autenticación para usuario:", name);
console.log("Conectando con la base de datos...");
const user = await prisma.user.findUnique({
where: { name }
});
console.log("Usuario encontrado en la base de datos:", user);
if (!user) {
console.log("Usuario no encontrado en la base de datos");
throw new Error("Usuario no encontrado");
}
console.log("Comparando contraseñas...");
const isMatch = await bcryptpare(password, user.password);
console.log("Resultado de la comparación de contraseñas:", isMatch);
if (!isMatch) {
console.log("La contraseña no coincide");
throw new Error("Contraseña incorrecta");
}
console.log("Usuario autenticado con éxito, generando token...");
const token = await generateToken(user.id);
console.log("Autenticación completada, devolviendo usuario y token");
return { user, token };
} catch (error) {
console.error("Error durante la autenticación:", error);
throw new Error(error instanceof Error ? error.message : "Error desconocido en la autenticación");
}
};
// Función para verificar si el token es válido
export const verifyToken = (token: string): { userId: number } | null => {
try {
console.log("Verificando token...");
const decoded = jwt.verify(token, JWT_SECRET) as jwt.JwtPayload;
console.log("Token verificado, payload decodificado:", decoded);
return decoded.userId ? { userId: decoded.userId } : null;
} catch (error) {
console.error("Error al verificar el token:", error instanceof Error ? error.message : error);
return null;
}
};
Frontend form fuction:
const handleLogin = async (e: React.FormEvent) => {
e.preventDefault();
const response = await fetch('/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ name, password }),
});
if (response.ok) {
const data = await response.json();
localStorage.setItem('token', data.token);
router.push('/admin');
} else {
alert('Wrong Credentials');
}
};