From 636d20d7a03ead5fccc7b1cf859437ddf6de3234 Mon Sep 17 00:00:00 2001 From: Marcos Date: Tue, 28 Jul 2026 20:09:23 +0200 Subject: [PATCH] Fix access token naming consistency and enforce encrypted_master_key validation in registration --- src/controllers/authController.js | 15 +++++++++------ src/services/authService.js | 10 +++++----- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/controllers/authController.js b/src/controllers/authController.js index 32aac7d..3c5e12c 100644 --- a/src/controllers/authController.js +++ b/src/controllers/authController.js @@ -16,6 +16,9 @@ const register = async (req, res) => { if (!email || !password) { return res.status(400).json({ error: 'Usuario y contraseña son obligatorios' }); } + if (!encrypted_master_key) { + return res.status(400).json({ error: 'encrypted_master_key es obligatorio' }); + } console.log(`Intentando registrar usuario: ${email}`); console.log(`Encrypted Master Key recibida: ${encrypted_master_key}`); // Registramos el usuario y emitimos tokens para entrar directamente @@ -23,11 +26,11 @@ const register = async (req, res) => { // Generamos tokens reutilizando el flujo de login (no hay deviceName en register) const nombreDispositivo = deviceName || req.headers['user-agent'] || 'Dispositivo Desconocido'; - const { accessToken, refresh_token } = await authService.login(email, password, nombreDispositivo); + const { access_token, refresh_token } = await authService.login(email, password, nombreDispositivo); res.status(201).json({ message: 'Usuario registrado con éxito', - accessToken, + access_token, refresh_token }); } catch (error) { @@ -43,11 +46,11 @@ const login = async (req, res) => { // Si Flutter no envía un nombre, intentamos leer el User-Agent const nombreDispositivo = deviceName || req.headers['user-agent'] || 'Dispositivo Desconocido'; - const { encrypted_master_key, accessToken, refresh_token } = await authService.login(email, password, nombreDispositivo); + const { encrypted_master_key, access_token, refresh_token } = await authService.login(email, password, nombreDispositivo); res.json({ message: 'Login exitoso', - accessToken, + access_token, refresh_token, encrypted_master_key: encrypted_master_key }); @@ -62,8 +65,8 @@ const refresh = async (req, res) => { const { refresh_token } = req.body; if (!refresh_token) return res.status(400).json({ error: 'Refresh token es obligatorio' }); - const { accessToken } = await authService.refreshAccessToken(refresh_token); - res.json({ accessToken }); + const { access_token } = await authService.refreshaccess_token(refresh_token); + res.json({ access_token }); } catch (error) { res.status(401).json({ error: error.message }); } diff --git a/src/services/authService.js b/src/services/authService.js index 93c5e59..11cecac 100644 --- a/src/services/authService.js +++ b/src/services/authService.js @@ -34,7 +34,7 @@ class AuthService { if (!isValid) throw new Error('Credenciales inválidas'); // A. Generar Access Token (Vence en 15 minutos - Sin datos sensibles) - const accessToken = jwt.sign( + const access_token = jwt.sign( { id: user.id, email: user.email }, JWT_SECRET, { expiresIn: '15m' } @@ -50,11 +50,11 @@ class AuthService { userId: user.id }); - return { encrypted_master_key: user.encrypted_master_key, accessToken, refreshToken: randomToken }; + return { encrypted_master_key: user.encrypted_master_key, access_token, refreshToken: randomToken }; } // REFRESH: Intercambia un Refresh Token válido por un nuevo Access Token limpio - async refreshAccessToken(tokenRecibido) { + async refreshaccess_token(tokenRecibido) { // 1. Buscar el token en la base de datos de Postgres const tokenGuardado = await RefreshToken.findOne({ where: { token: tokenRecibido }, @@ -68,13 +68,13 @@ class AuthService { const user = tokenGuardado.User; // 2. Si existe, emitimos un nuevo Access Token de 15 minutos - const newAccessToken = jwt.sign( + const newaccess_token = jwt.sign( { id: user.id, email: user.email }, JWT_SECRET, { expiresIn: '15m' } ); - return { accessToken: newAccessToken }; + return { access_token: newaccess_token }; } // CERRAR SESIÓN EN UN SOLO DISPOSITIVO (El bisturí)