arcos-backend/app/Http/Middleware/ArcoTokenMiddleware.php

66 lines
1.9 KiB
PHP

<?php
namespace App\Http\Middleware;
use App\Models\Arco;
use Closure;
use Illuminate\Http\Request;
use Notsoweb\ApiResponse\Enums\ApiResponse;
use Symfony\Component\HttpFoundation\Response;
class ArcoTokenMiddleware
{
/**
* Handle an incoming request.
*/
public function handle(Request $request, Closure $next): Response
{
$tokenPlano = $request->bearerToken();
if (!$tokenPlano) {
return ApiResponse::UNAUTHORIZED->response([
'message' => 'Token de arco no proporcionado'
]);
}
// Buscar arco por token plano
$arco = Arco::buscarPorToken($tokenPlano);
if (!$arco) {
return ApiResponse::UNAUTHORIZED->response([
'message' => 'Token de arco inválido'
]);
}
if (!$arco->activo) {
return ApiResponse::FORBIDDEN->response([
'message' => 'Arco desactivado'
]);
}
// Validación de IP deshabilitada para desarrollo
// PROBLEMA: En Docker, $request->ip() retorna la IP del gateway (172.x.x.x), no la IP real del cliente
// SOLUCIÓN PRODUCCIÓN: Usar un proxy inverso externo (nginx/traefik) que pase X-Forwarded-For correctamente
// Para desarrollo, la validación de token es suficiente
/*
$requestIp = $request->ip();
if ($arco->ip_address !== $requestIp) {
return ApiResponse::FORBIDDEN->response([
'message' => 'Token no autorizado para esta IP',
'detail' => [
'ip_registrada_arco' => $arco->ip_address,
'ip_del_request' => $requestIp,
'arco_nombre' => $arco->nombre
]
]);
}
*/
// Agregar el arco al request para uso posterior
$request->merge(['arco_autenticado' => $arco]);
return $next($request);
}
}