GraphQL es tanto un lenguaje de consulta para APIs como un tiempo de ejecución para llevar a cabo esas consultas con tus datos existentes. Ofrece una descripción completa y clara de los datos disponibles en tu API, permite que los clientes soliciten precisamente lo que necesitan sin excesos, facilita la evolución de las APIs con el tiempo y soporta herramientas robustas para desarrolladores.
Control de Acceso y Optimización de Consultas en GraphQL
Control de Acceso
La autorización es un conjunto de reglas o lógica de negocio que determina si un usuario, sesión o contexto tiene la lista de control de acceso (ACL) para realizar ciertas acciones o ver datos específicos.
Este comportamiento debe ser aplicado en la capa de lógica de negocio. Aunque podría ser tentador colocar la lógica de autorización directamente dentro de la capa de GraphQL, generalmente es más apropiado manejarla en otro lugar.
Optimización de Consultas
Optimizar las consultas de GraphQL implica técnicas como minimizar la obtención y procesamiento de datos innecesarios para mejorar los tiempos de respuesta y reducir la carga del servidor. Esto resulta en una aplicación más eficiente, ofreciendo una mejor experiencia de usuario, un mayor compromiso y retención del usuario, y una mayor escalabilidad del servidor.
Formas de Optimizar las Consultas de GraphQL
- N+1 (Carga por Lotes)
- Sobrecarga y Subcarga de Datos
- Caché para Reducir Latencia
- Paginación
Mejorando el Control de Acceso y la Optimización de Consultas en GraphQL
El Motor de Autorización valida los permisos de nodos y campos utilizando ACL (lista de control de acceso) y optimiza las consultas GraphQL basadas en los permisos. Además, el Resolvedor N+1 mejora el rendimiento consolidando las consultas. Este enfoque aborda el problema N+1.
Actores
- Consulta GraphQL: Una solicitud enviada por un cliente a un servidor GraphQL para obtener datos específicos.
- Motor GraphQL: Se refiere a un servicio que permite ejecutar consultas GraphQL.
- Motor de Autorización: Valida los permisos de nodos y campos utilizando ACL y optimiza la consulta GraphQL basada en los permisos de los campos.
- Resolvedor N+1: Reduce la sobrecarga y la latencia asociadas con múltiples consultas a la base de datos, mejorando el rendimiento y la eficiencia.
Mejora del Control de Acceso
Implementación Existente
Supongamos que una aplicación tiene Productos, Proveedores y Direcciones. Acceder a los datos de Proveedor y Dirección requiere autenticación del usuario, lo cual puede ser manejado fácilmente en los resolvedores.
Sin embargo, los datos del proveedor están restringidos a los usuarios administradores, y algunos campos del proveedor solo son accesibles para roles específicos. Por otro lado, los productos son públicos y pueden ser visualizados con el rol de Propietario del Producto. Ejecutar la consulta mencionada (Figura 3) devolverá datos del producto junto con los datos asociados del Proveedor y la Dirección, lo que conduce a un problema de seguridad.
Implementación Mejorada
Los nodos y campos de la consulta se validan según los permisos del usuario, y se genera una consulta GraphQL optimizada.
La Figura 4 es un ejemplo de cómo podrías implementar la autenticación personalizada en una API GraphQL utilizando Node.js. En este código, el rol se extrae del encabezado de Autorización y luego se usa, junto con la consulta, para validar la autorización.
En este ejemplo, estamos utilizando el rol y el permiso de un usuario de la sesión o solicitud que controlan el acceso a consultas y mutaciones específicas en el esquema GraphQL. Hemos definido las reglas de rol y permiso en el esquema GraphQL para todos los usuarios.
Este método verifica recursivamente el rol y el permiso en todos los nodos y campos. Si un nodo o campo no está permitido, entonces realiza una de las siguientes acciones basadas en la configuración:
- Eliminar nodo o campo.
- Devolver campo o nodo con un mensaje de error.
- Lanzar excepción.
Una vez que la consulta GraphQL se valida contra el esquema, este método devolverá la consulta GraphQL optimizada.
Mejorando la Optimización de Consultas ORM Usando N+1
Implementación Existente
Es un problema técnico que afecta el rendimiento de una consulta. Puede ocurrir en aplicaciones que utilizan un framework de Mapeo Objeto-Relacional (ORM) para acceder a una base de datos.
Generalmente surge cuando la aplicación necesita cargar una colección de entidades relacionadas desde la base de datos.
Supongamos que hay 2 productos; necesita realizar 1 consulta para recuperar los productos y 2 consultas adicionales para obtener los proveedores de cada producto individualmente.
Una consulta recupera la lista de productos, y una consulta separada obtiene los proveedores para cada producto. El número de consultas de proveedores es igual al número de productos.
Implementación Mejorada
Una vez que la solicitud llega al resolvedor N+1, el resolvedor N+1 optimiza las consultas para minimizar el número de solicitudes a la base de datos, reduciéndolas a una sola consulta para los datos principales y una consulta adicional para los datos relacionados, mitigando efectivamente el problema N+1.
- Consulta de Datos Principales: Una sola consulta que recupera el conjunto principal de datos requeridos para la aplicación.
- Consulta de Datos Relacionados: Una consulta adicional que obtiene cualquier dato relacionado necesario para completar el conjunto de datos.
Después de que se hayan completado todos los resolvedores de consultas, el servidor devuelve los datos optimizados al cliente en formato JSON.
Conclusión
Hemos señalado que la implementación de mecanismos de autorización de grano fino, junto con medidas de seguridad mejoradas, es crucial para asegurar una API GraphQL. Esto incluye tanto la seguridad a nivel de nodo como a nivel de campo.
Como describe este artículo, el problema N+1 ocurre cuando una consulta no optimizada conduce a llamadas excesivas a la base de datos en GraphQL. Hemos proporcionado una solución para superar el problema N+1. Esto disminuye el uso de recursos del servidor de base de datos, resultando en ahorros de costos y mejor escalabilidad. Además, al mejorar el rendimiento de las consultas, esto mejora la experiencia del usuario al reducir los tiempos de respuesta de las consultas.
Source:
https://dzone.com/articles/optimizing-fine-grained-graphql-access-control-and-queries