Antecedentes:
Actualmente en el proceso de construir una API REST, usando el nodo w / express y es consumida por una aplicación móvil y eventualmente un sitio web (basado en un navegador moderno).
Estoy tratando de identificar la mejor manera de autorizar la solicitud de actualización / acción de un usuario para que solo se les permita modificar sus propios recursos. Las acciones ocurrirán a una velocidad semi alta, de ahí la preocupación.
Nota: La propiedad de entidades no se puede transferir en este caso de uso.
Posibles soluciones:
Solución : almacene y mantenga una lista de los recursos de cada usuario en una sesión de servidor respaldada por algo como reddis.
Preocupación (es) : persistir en una sesión del lado del servidor tiene su propio conjunto de complejidades específicamente escalables con múltiples servidores. Esto también viola el REST. do-sessions-realmente-violate-restfulness para más información.
Solución: haga una consulta de lectura antes de la consulta de actualización / acción del usuario. IE me da los elementos de este usuario, entonces si está en la lista proceda con la actualización.
Preocupación (es): Sobrecarga de una lectura adicional cada vez que un usuario actúa en nombre de un recurso.
Solución: Pase la identificación de usuario a la capa db y hágalo parte de la actualización condicional o, si desea obtener más lujo, use algo como la seguridad de nivel de fila de Postgres para ese recurso, dependiendo del backend de datos.
Preocupación (es): esto parece un poco tarde en el ciclo de vida de la solicitud para verificar si el recurso es el usuario solicitante. El error tendría que ser lanzado desde el backend de datos. En la misma nota, también estaría un poco fuera de lugar teniendo en cuenta que la autenticación y la autorización basada en roles a menudo se realizan al comienzo del ciclo de vida de la solicitud. La implementación también depende del backend de datos. También empuja la lógica de negocios en el backend de datos.
Solución: tipo de sesión firmada por el cliente. Ya sea con un JWT o una cookie cifrada / firmada. Esencialmente, mantener una sesión confiable que contenga una lista de los identificadores de recursos del usuario.
Preocupación (es): el tamaño de la sesión del lado del cliente. El hecho de que se enviaría con cada solicitud, incluso cuando no sea necesario. El mantenimiento se vuelve extremadamente complejo cuando presenta la posibilidad de múltiples sesiones / clientes activos. ¿Cómo actualizaría el estado del lado del cliente cuando se agrega un recurso en otro cliente?
Solución: Pase un token de actualización firmado (JWT) o una url al cliente con el recurso cuando se recupera el recurso. Espere que cuando un recurso se actualice / accione. El token firmado contendría la identificación del usuario y la identificación del recurso y usted podría verificarlo fácilmente contra ellas.
Preocupación (es): se vuelve complejo si la propiedad del recurso es transferible, pero en mi caso eso no es una preocupación. Introduce la complejidad sobre una lectura antes de la actualización. ¿Es un poco extraño?
Pensamientos finales:
Me estoy inclinando hacia la última solución, pero debido a que no veo que suceda muy a menudo, me pregunto si me estoy perdiendo algo. o tal vez es parte de un patrón de diseño que no conozco.