74 lines
1.9 KiB
JavaScript
74 lines
1.9 KiB
JavaScript
import { Hono } from 'hono'
|
|
import { sign } from 'hono/jwt'
|
|
import { pool } from '../services/db.service.js'
|
|
|
|
const auth = new Hono()
|
|
|
|
// Configuración externa
|
|
const SYNO_BASE = 'http://192.168.1.100:5000/webapi/auth.cgi'
|
|
const JWT_SECRET = process.env.JWT_SECRET || 'cambia_esto_en_el_env'
|
|
|
|
auth.post('/login', async (c) => {
|
|
const { username, password } = await c.req.json().catch(() => ({}))
|
|
|
|
if (!username || !password) {
|
|
return c.json({ success: false, message: 'Faltan credenciales' }, 400)
|
|
}
|
|
|
|
try {
|
|
// 1. Preparar parámetros para el NAS Synology
|
|
const params = new URLSearchParams({
|
|
api: 'SYNO.API.Auth',
|
|
version: '6',
|
|
method: 'login',
|
|
account: username,
|
|
passwd: password,
|
|
format: 'sid'
|
|
})
|
|
|
|
// 2. Petición al NAS usando el fetch nativo
|
|
const response = await fetch(`${SYNO_BASE}?${params.toString()}`)
|
|
const data = await response.json()
|
|
|
|
if (data.success && data.data) {
|
|
// 3. Generar JWT (expiración en 8 horas)
|
|
const payload = {
|
|
username,
|
|
sid: data.data.sid,
|
|
exp: Math.floor(Date.now() / 1000) + (60 * 60 * 8)
|
|
}
|
|
|
|
const token = await sign(payload, JWT_SECRET)
|
|
|
|
// 4. Asegurar el usuario en la base de datos (MariaDB)
|
|
try {
|
|
await pool.query('INSERT IGNORE INTO Usuarios (Usuario) VALUES (?)', [username])
|
|
} catch (dbError) {
|
|
console.error('Error al registrar usuario en DB:', dbError)
|
|
}
|
|
|
|
return c.json({
|
|
success: true,
|
|
token,
|
|
data: {
|
|
user: { username }
|
|
}
|
|
})
|
|
}
|
|
|
|
// Error de autenticación del NAS
|
|
return c.json({
|
|
success: false,
|
|
message: `Error de autenticación (Código: ${data.error?.code || 'unknown'})`
|
|
}, 401)
|
|
|
|
} catch (error) {
|
|
console.error('Error crítico en Auth:', error)
|
|
return c.json({
|
|
success: false,
|
|
message: 'NAS Unreachable / Internal Error'
|
|
}, 500)
|
|
}
|
|
})
|
|
|
|
export default auth |