Quiero crear una aplicación SaaS con AngularJS y Node.js administrando en el lado del servidor solo los permisos de usuario de las operaciones CRUD (solo modelos, sin controladores, todos con API RESTful), por lo que toda la lógica estará en el cliente. ¿Cuáles son los riesgos de esto?

Riesgo # 1: múltiples modelos

Eventualmente querrá consultar la base de datos desde otro lugar que no sea la aplicación que está creando o en un contexto que no sea el usuario final principal de la aplicación.

Recuerde que casi todas las aplicaciones tienen múltiples usuarios.

  • Si vende algo, la contabilidad necesitará acceso.
  • Si ofrece soporte a los clientes, necesitará una visibilidad profunda de su cuenta.
  • Si se comunica con ellos (correos electrónicos, notificaciones push), querrá almacenar datos sobre cosas como capacidad de entrega y clics. Datos que generalmente no están expuestos al usuario que paga.
  • Si planea ejecutar pruebas A | B o algún tipo de proceso de mejora continua, deberá ocultar estos datos a los usuarios.

Uno de los riesgos clave aquí es cómo modelar y asegurar todo esto. Desea que Modelos en el lado del cliente les permita acceder a los datos a través de Angular, pero también necesita Modelos en el lado del servidor para administrar qué datos entran y salen del sistema. Todos sueñan con que estos sean los mismos Modelos, pero no lo son, exactamente por la razón que señalé anteriormente. Su equipo de soporte tiene una vista diferente del Modelo de usuario que el cliente.

Sueña con administrar solo los permisos de las operaciones CRUD, pero incluso Angular.js requiere al menos un controlador básico en el lado del servidor para entregar el HTML / CSS / JS para cargar el sitio. Por supuesto, debido a que tiene diferentes tipos de usuarios, necesitará múltiples de estos para poder enviar una IU al equipo de soporte que sea diferente de la aplicación principal.

El procesamiento fuera de línea ( como un correo electrónico diario ) complica aún más esto porque necesitará una API a la que pueda llamar algún servicio pero que sea inaccesible para la interfaz de usuario normal.

Riesgo # 2: seguridad

Entonces hay un patrón conocido para esto. Si puede implementar Oauth2 o usar un servicio existente para esto, generalmente puede hacer la parte de autenticación con bastante facilidad. Pero tienes que saltar a través de varios aros como manejar XSS.

El mayor desafío es la parte de autenticación . Debe ser muy consciente de quién llama al punto final REST dado junto con lo que se les permite ver / hacer. Su código tiene que estar muy atento al manejo de solicitudes entrantes incorrectas de los usuarios porque es trivial falsificarlas y buscar vulnerabilidades.

Por ejemplo, si un usuario malintencionado ve un campo en el objeto Usuario llamado “IsDeleted” junto con una ID y puede encontrar las ID de otros usuarios, entonces es bastante trivial comenzar a publicar actualizaciones que intentan eliminar varios usuarios. Si el código en el lado CRUD no está desinfectando las solicitudes y la comprobación de los permisos correctamente es muy posible que un usuario cause muchos daños muy fácilmente.

Del mismo modo, si está creando una aplicación SaaS, tendrá varios clientes con datos que no pueden interactuar. Deberá ser muy consciente de las “secuencias de comandos entre sitios” de sus propios clientes.

Resumen: es más complicado

He creado varias aplicaciones web a lo largo de los años. Actualmente estoy involucrado en la construcción de una aplicación SaaS empresarial que en realidad tiene una API de acceso público.

Creo que la premisa de que su API solo administrará “permisos de usuario de operaciones CRUD” es una simplificación dramática.

Si desea validar que la lógica se haya aplicado correctamente, aún tendrá que agregar lógica en el servidor, o de lo contrario está arriesgando su software por fallar a lo grande, tanto por solicitudes incorrectas o con errores como por secuencias de comandos mal intencionadas.

Al mismo tiempo, y por supuesto, ¡haga la mayor cantidad de aplicaciones posible del lado del cliente! Haga que funcione sin conexión y no cuente cada solicitud pasará sin problemas a través de un maravilloso Internet. La mayoría de las conexiones en el mundo de hoy no son confiables, a diferencia de la mayoría de los programadores les gusta creer.

Creo que desea eliminar el trabajo pesado que realiza el servidor, y eso es algo bueno que hacer … Pero trate de pensar en toda la economía del ecosistema, el software sostenible. Probablemente sea más barato para el conjunto tener el servidor haciendo X bits por cada Y bits que hace el cliente, porque el proceso del cliente no está optimizado para hacerlo, por lo que es más costoso que el servidor, incluso a gran escala, especialmente si es algo así como la transmisión, que puede tener enormes beneficios de un procesamiento centralizado en términos de costos.

Si puede lograr que todo el sistema sea óptimo, incluso si el backend es más costoso para el bolsillo de la compañía, entonces existe tal cosa como el pago de devoluciones que la compañía se beneficiará enormemente a largo plazo. Además, ¡cuéntanos cómo lo has hecho! ;PAGS