Estoy trabajando en una aplicación que se planea licenciar a los OEM, quienes a su vez lo ofrecerían como un servicio para sus usuarios. Alojaríamos el servidor de aplicaciones y el OEM, opcionalmente, alojaría el cliente web de la aplicación. Debido a esto, deseamos que los OEM puedan optar por que los usuarios se autentiquen a través del OEM, utilizando sus credenciales existentes, sin necesidad de que realicen una cuenta específicamente para la aplicación.
Tengo una idea de cómo lograr esto, pero creo que debería haber una mejor manera. En resumen, el cliente envía un token de autorización al servidor de la aplicación en nombre del usuario, identificándolos y al OEM con el que se han autenticado. En un poco más de detalle:
Al obtener una licencia para la aplicación, nuestro servidor y el servidor OEM negocian una cadena secreta compartida. (Aún no estoy seguro de si el secreto compartido debe ser dictado por nosotros o elegido por el OEM con un requisito de longitud mínima). Cuando un usuario que ya se ha autenticado con el OEM carga la aplicación por primera vez, el cliente envía una solicitud AJAX. al servidor OEM que solicita un ticket de autenticación, y luego lo pasa al servidor de aplicaciones con una solicitud POST. Este ticket tiene los parámetros
userID, oemID, timestamp, token, digest
donde oemID
es una cadena que representa al OEM en cuestión, token
es un valor aleatorio generado por el servidor OEM, y digest
es la codificación de la cadena base64 de
HMAC( sharedSecret, userID"|"oemID"|"timestamp"|"token )
El servidor de la aplicación verifica la marca de tiempo para ver si el ticket sigue siendo válido, luego obtiene el secreto compartido correspondiente para el oemID
dado y lo usa para hacer un hash de su propio resumen. Luego vuelve a hacer los dos compendios y los compara entre sí. Si ambos coinciden, el servidor de aplicaciones admite que la solicitud provino de un usuario autenticado en el cliente del OEM, y envía una cookie de sesión al navegador del usuario y almacena userID
y oemID
en el almacén de la sesión. para identificar de forma única las futuras solicitudes de ese usuario. (Podemos suponer que el ID de usuario es único para un OEM determinado, pero no universalmente, por lo tanto, utilizamos ambos). Toda esta interacción (y toda la actividad en la aplicación) se realiza a través de HTTPS.
Principalmente, me preocupa que este sistema parezca un poco intrincado, pero eso podría deberse a que la mayor parte de mi experiencia previa con sistemas de autenticación ha involucrado páginas de inicio de sesión antiguas o ha hecho uso de bibliotecas que extraen esencialmente todo el trabajo . ¿Es este esquema esencialmente viable, o existen problemas claros o áreas de mejora? ¿Es suficiente verificar el resumen del ticket para confiar en el mensaje de inicialización? ¿Realmente tiene sentido confiar de manera implícita en el servidor OEM, o hay algún motivo y medio para socavar el proceso de autenticación de una manera que afecte más que a sus propios usuarios? Sobre todo, ¿deja fuera algo deslumbrante?