Add deviceName to registration and login processes for better device tracking
Despliegue Automático / desplegar (push) Successful in 4m17s

This commit is contained in:
2026-07-28 18:17:11 +02:00
parent 87cde27436
commit 4da7cad9d8
3 changed files with 16 additions and 15 deletions
+2 -1
View File
@@ -48,7 +48,8 @@ Body:
{ {
"username": "maria", "username": "maria",
"password": "123456", "password": "123456",
"encrypted_master_key": "texto_cifrado_opcional" "encrypted_master_key": "texto_cifrado_opcional",
"deviceName": "Flutter Pixel"
} }
``` ```
+12 -12
View File
@@ -11,7 +11,7 @@ if (!JWT_SECRET) {
const register = async (req, res) => { const register = async (req, res) => {
try { try {
console.log(req.body); // Log completo del body para depuración console.log(req.body); // Log completo del body para depuración
const { username, password, encrypted_master_key } = req.body; const { username, password, encrypted_master_key, deviceName } = req.body;
if (!username || !password) { if (!username || !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' });
@@ -22,13 +22,13 @@ const register = async (req, res) => {
await authService.register(username, password, encrypted_master_key); await authService.register(username, password, encrypted_master_key);
// 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 = req.headers['user-agent'] || 'Dispositivo Desconocido'; const nombreDispositivo = deviceName || req.headers['user-agent'] || 'Dispositivo Desconocido';
const { accessToken, refreshToken } = await authService.login(username, password, nombreDispositivo); const { accessToken, refresh_token } = await authService.login(username, password, nombreDispositivo);
res.status(201).json({ res.status(201).json({
message: 'Usuario registrado con éxito', message: 'Usuario registrado con éxito',
accessToken, accessToken,
refreshToken refresh_token
}); });
} catch (error) { } catch (error) {
res.status(400).json({ error: error.message }); res.status(400).json({ error: error.message });
@@ -43,13 +43,13 @@ 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 { user, accessToken, refreshToken } = await authService.login(username, password, nombreDispositivo); const { encrypted_master_key, accessToken, refresh_token } = await authService.login(username, password, nombreDispositivo);
res.json({ res.json({
message: 'Login exitoso', message: 'Login exitoso',
accessToken, accessToken,
refreshToken, refresh_token,
encrypted_master_key: user.encrypted_master_key encrypted_master_key: encrypted_master_key
}); });
} catch (error) { } catch (error) {
res.status(401).json({ error: error.message }); res.status(401).json({ error: error.message });
@@ -59,10 +59,10 @@ const login = async (req, res) => {
// 3. REFRESCAR TOKEN // 3. REFRESCAR TOKEN
const refresh = async (req, res) => { const refresh = async (req, res) => {
try { try {
const { refreshToken } = req.body; const { refresh_token } = req.body;
if (!refreshToken) 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(refreshToken); const { accessToken } = await authService.refreshAccessToken(refresh_token);
res.json({ accessToken }); res.json({ accessToken });
} catch (error) { } catch (error) {
res.status(401).json({ error: error.message }); res.status(401).json({ error: error.message });
@@ -72,8 +72,8 @@ const refresh = async (req, res) => {
// 4. CERRAR SESIÓN // 4. CERRAR SESIÓN
const logout = async (req, res) => { const logout = async (req, res) => {
try { try {
const { refreshToken } = req.body; const { refresh_token } = req.body;
await authService.logoutDevice(refreshToken); await authService.logoutDevice(refresh_token);
res.json({ message: 'Sesión cerrada en el dispositivo actual' }); res.json({ message: 'Sesión cerrada en el dispositivo actual' });
} catch (error) { } catch (error) {
res.status(400).json({ error: error.message }); res.status(400).json({ error: error.message });
+2 -2
View File
@@ -46,11 +46,11 @@ class AuthService {
// C. Guardar el Refresh Token asociado al dispositivo en PostgreSQL // C. Guardar el Refresh Token asociado al dispositivo en PostgreSQL
await RefreshToken.create({ await RefreshToken.create({
token: randomToken, token: randomToken,
deviceName: deviceName || 'Dispositivo Móvil', deviceName: deviceName || 'Dispositivo Desconocido',
userId: user.id userId: user.id
}); });
return { user, accessToken, refreshToken: randomToken }; return { encrypted_master_key: user.encrypted_master_key, accessToken, 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