Estoy diseñando un servicio web RESTful al que deben acceder los usuarios, pero también otros servicios y aplicaciones web. Todas las solicitudes entrantes deben estar autenticadas. Toda la comunicación se realiza a través de HTTPS. La autenticación de usuario funcionará en función de un token de autenticación, adquirido mediante la POST del nombre de usuario y la contraseña (a través de una conexión SSL) a un recurso de sesión proporcionado por el servicio.
En el caso de los clientes de servicios web, no hay un usuario final detrás del servicio al cliente. Las solicitudes se inician mediante tareas programadas, eventos o algunas otras operaciones informáticas. La lista de servicios de conexión se conoce de antemano (obviamente, supongo). ¿Cómo debo autenticar estas solicitudes provenientes de otros servicios (web)? Quiero que el proceso de autenticación sea lo más fácil posible de implementar para esos servicios, pero no a costa de la seguridad. ¿Cuáles serían los estándares y las mejores prácticas para un escenario como este?
Opciones en las que puedo pensar (o que me han sugerido):
Haga que los servicios al cliente recurran a tener un nombre de usuario y contraseña "falsos", y autentíquelos de la misma manera que los usuarios. No me gusta esta opción, simplemente no se siente bien.
Asigne una identificación de aplicación permanente para el servicio del cliente, posiblemente también una clave de aplicación. Por lo que he entendido, esto es lo mismo que tener nombre de usuario + contraseña. Con esta identificación y clave, puedo autenticar cada solicitud o crear un token de autenticación para autenticar más solicitudes. De cualquier manera, no me gusta esta opción, porque cualquiera que pueda obtener la identificación y la clave de la aplicación puede hacerse pasar por el cliente.
Podría agregar una verificación de dirección IP a la opción anterior. Esto dificultaría la realización de solicitudes falsas.
Certificados de cliente. Configurar mi propia autoridad de certificación, crear un certificado raíz y crear certificados de cliente para los servicios del cliente. Sin embargo, me vienen a la mente un par de cuestiones: a) ¿cómo puedo permitir que los usuarios se autentiquen sin certificados yb) qué tan complicado es implementar este escenario desde el punto de vista del servicio al cliente?
Algo más, ¿debe haber otras soluciones por ahí?
Mi servicio se ejecutaría en Java, pero omití deliberadamente información sobre el marco específico en el que se construiría, porque estoy más interesado en los principios básicos y no tanto en los detalles de implementación; supongo que la mejor solución para esto será ser posible de implementar independientemente del marco subyacente. Sin embargo, soy un poco inexperto en este tema, por lo que también apreciaré mucho los consejos y ejemplos concretos sobre la implementación real (como bibliotecas útiles de terceros, artículos, etc.).