Estamos tratando de determinar la mejor manera de autorizar a los usuarios en una arquitectura de microservicio, mientras aseguramos que los microservicios tengan permisos limitados. Nuestra arquitectura utiliza un servicio de autorización central para manejar la emisión de tokens JWT.
Tenemos los siguientes requisitos:
-
Los usuarios deben estar limitados para realizar ciertos roles. p.ej. un usuario solo debe poder crear / modificar / leer el contenido que posee.
-
Los microservicios deben limitarse solo a los permisos que requieren. p.ej. a un microservicio que solo necesita leer datos de otro servicio se le debe prohibir explícitamente que escriba datos en ese servicio.
Como ejemplo, supongamos que tenemos un sistema donde los usuarios pueden cargar imágenes a un servicio de almacenamiento de imágenes. Tenemos un servicio de etiquetado que etiqueta automáticamente las imágenes con una ubicación. Los usuarios solo pueden CRUD sus propias imágenes. El servicio de etiquetado puede leer cualquier imagen del servicio de almacenamiento de imágenes, sin embargo, no debería poder modificar / eliminar.
¿Cuál es una buena manera de lograr lo anterior utilizando tokens JWT? Algunas soluciones que hemos discutido son:
-
El servicio de almacenamiento de imágenes expone 2 API, una que está disponible externamente (otorgando acceso CRUD al usuario), y una que está disponible internamente (otorgando acceso interno de solo lectura). Parece inflexible: ¿qué sucede si otro servicio interno necesita acceso de lectura / escritura a todas las imágenes (por ejemplo, una que elimina automáticamente las imágenes explícitas)?
-
Configuramos dos permisos en el JWT del usuario, uno es CRUD_OwnImages, el otro es READ_ForAnalysis. El servicio de etiquetado puede ver si el usuario tiene permisos READ_ForAnalysis y, de ser así, realizar la solicitud correspondiente. Tenemos otro microservicio que verifica si el usuario tiene CRUD_OwnImages para las operaciones de CRUD en las propias imágenes del usuario. Esto coloca la responsabilidad en cada microservicio para garantizar que el usuario esté restringido a las acciones que requiere. El almacén de imágenes no tiene forma de restringir cada microservicio con este enfoque, por lo que es potencialmente desagradable y propenso a errores.
-
Le damos al microservicio de etiquetado su propio usuario, con READ_ForAnalysis como permiso. Luego, cuando el servicio de etiquetado solicita imágenes del almacén de imágenes, se le da acceso a ellas, pero se le prohíbe modificarlas. El usuario del usuario solo tiene el permiso CRUD_OwnImages, por lo que puede recuperar y obtener acceso solo a sus imágenes desde la interfaz. Si otro servicio necesita CRUD para todos los datos, podemos proporcionarle CRUD_AllData o similar. Nos gusta este enfoque, ya que cada servicio ahora es responsable de sus propios datos (en lugar de que esa lógica se duplique en múltiples servicios), pero ¿qué sucede si el servicio requiere permisos de usuario y de microservicio? ¿Podemos enviar dos tokens JWT (tanto del usuario como del microservicio) de forma segura? ¿Hay alguna manera de combinar los permisos de forma segura y enviarlos a través? p.ej. ¿El servicio de etiquetado puede leer todas las imágenes pero también puede escribir las imágenes del usuario con la ubicación?
El problema se agrava si la información del usuario se necesita más adelante (2 o 3 microservicios de distancia). ¿Asumimos simplemente que corresponde a los microservicios individuales restringirse a las acciones que necesitan, y no hacerlo explícito?