Fix access token naming consistency and enforce encrypted_master_key validation in registration
Despliegue Automático / desplegar (push) Successful in 35s
Despliegue Automático / desplegar (push) Successful in 35s
This commit is contained in:
@@ -16,6 +16,9 @@ const register = async (req, res) => {
|
|||||||
if (!email || !password) {
|
if (!email || !password) {
|
||||||
return res.status(400).json({ error: 'Usuario y contraseña son obligatorios' });
|
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(`Intentando registrar usuario: ${email}`);
|
||||||
console.log(`Encrypted Master Key recibida: ${encrypted_master_key}`);
|
console.log(`Encrypted Master Key recibida: ${encrypted_master_key}`);
|
||||||
// Registramos el usuario y emitimos tokens para entrar directamente
|
// 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)
|
// Generamos tokens reutilizando el flujo de login (no hay deviceName en register)
|
||||||
const nombreDispositivo = deviceName || req.headers['user-agent'] || 'Dispositivo Desconocido';
|
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({
|
res.status(201).json({
|
||||||
message: 'Usuario registrado con éxito',
|
message: 'Usuario registrado con éxito',
|
||||||
accessToken,
|
access_token,
|
||||||
refresh_token
|
refresh_token
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -43,11 +46,11 @@ const login = async (req, res) => {
|
|||||||
// Si Flutter no envía un nombre, intentamos leer el User-Agent
|
// Si Flutter no envía un nombre, intentamos leer el User-Agent
|
||||||
const nombreDispositivo = deviceName || req.headers['user-agent'] || 'Dispositivo Desconocido';
|
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({
|
res.json({
|
||||||
message: 'Login exitoso',
|
message: 'Login exitoso',
|
||||||
accessToken,
|
access_token,
|
||||||
refresh_token,
|
refresh_token,
|
||||||
encrypted_master_key: encrypted_master_key
|
encrypted_master_key: encrypted_master_key
|
||||||
});
|
});
|
||||||
@@ -62,8 +65,8 @@ const refresh = async (req, res) => {
|
|||||||
const { refresh_token } = req.body;
|
const { refresh_token } = req.body;
|
||||||
if (!refresh_token) return res.status(400).json({ error: 'Refresh token es obligatorio' });
|
if (!refresh_token) return res.status(400).json({ error: 'Refresh token es obligatorio' });
|
||||||
|
|
||||||
const { accessToken } = await authService.refreshAccessToken(refresh_token);
|
const { access_token } = await authService.refreshaccess_token(refresh_token);
|
||||||
res.json({ accessToken });
|
res.json({ access_token });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.status(401).json({ error: error.message });
|
res.status(401).json({ error: error.message });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class AuthService {
|
|||||||
if (!isValid) throw new Error('Credenciales inválidas');
|
if (!isValid) throw new Error('Credenciales inválidas');
|
||||||
|
|
||||||
// A. Generar Access Token (Vence en 15 minutos - Sin datos sensibles)
|
// 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 },
|
{ id: user.id, email: user.email },
|
||||||
JWT_SECRET,
|
JWT_SECRET,
|
||||||
{ expiresIn: '15m' }
|
{ expiresIn: '15m' }
|
||||||
@@ -50,11 +50,11 @@ class AuthService {
|
|||||||
userId: user.id
|
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
|
// 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
|
// 1. Buscar el token en la base de datos de Postgres
|
||||||
const tokenGuardado = await RefreshToken.findOne({
|
const tokenGuardado = await RefreshToken.findOne({
|
||||||
where: { token: tokenRecibido },
|
where: { token: tokenRecibido },
|
||||||
@@ -68,13 +68,13 @@ class AuthService {
|
|||||||
const user = tokenGuardado.User;
|
const user = tokenGuardado.User;
|
||||||
|
|
||||||
// 2. Si existe, emitimos un nuevo Access Token de 15 minutos
|
// 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 },
|
{ id: user.id, email: user.email },
|
||||||
JWT_SECRET,
|
JWT_SECRET,
|
||||||
{ expiresIn: '15m' }
|
{ expiresIn: '15m' }
|
||||||
);
|
);
|
||||||
|
|
||||||
return { accessToken: newAccessToken };
|
return { access_token: newaccess_token };
|
||||||
}
|
}
|
||||||
|
|
||||||
// CERRAR SESIÓN EN UN SOLO DISPOSITIVO (El bisturí)
|
// CERRAR SESIÓN EN UN SOLO DISPOSITIVO (El bisturí)
|
||||||
|
|||||||
Reference in New Issue
Block a user