Todavía estoy tratando de encontrar la mejor solución de seguridad para proteger la API REST, porque la cantidad de aplicaciones móviles y API aumenta cada día.
He intentado diferentes formas de autenticación, pero todavía tengo algunos malentendidos, por lo que necesito el consejo de alguien más experimentado.
Déjame decirte cómo entiendo todo esto. Si entiendo algo incorrectamente, avíseme.
En la medida en que la API REST no tiene estado y la WEB en general, debemos enviar algunos datos de autenticación en cada solicitud (cookies, token ...). Conozco tres mecanismos ampliamente utilizados para autenticar usuarios
Token con HTTPS. He usado este enfoque muchas veces, es lo suficientemente bueno con HTTPS. Si el usuario proporciona la contraseña y el inicio de sesión correctos, recibirá un token en respuesta y lo usará para otras solicitudes. La ficha es generada por el servidor y almacenada, por ejemplo, en la tabla separada o la misma donde se almacena la información del usuario. Entonces, para cada solicitud, el servidor verifica si el usuario tiene un token y es el mismo que en la base de datos. Todo es bastante sencillo.
Token JWT. Este token es autodescriptivo, contiene toda la información necesaria sobre el token en sí, el usuario no puede cambiar, por ejemplo, la fecha de vencimiento o cualquier otro reclamo, porque este token es generado (firmado) por el servidor con una palabra clave secreta. Esto también está claro. Pero un gran problema, personalmente para mí, es cómo invalidar el token.
OAuth 2. No entiendo por qué este enfoque debería usarse cuando la comunicación se establece directamente entre el servidor y el cliente. Según tengo entendido, el servidor OAuth se usa para emitir tokens con un alcance restringido para permitir que otras aplicaciones accedan a la información del usuario sin almacenar la contraseña y el inicio de sesión. Esta es una gran solución para las redes sociales, cuando el usuario desea registrarse en alguna página, el servidor puede solicitar permisos para obtener información del usuario, por ejemplo de Twitter o Facebook, y llenar los campos de registro con datos del usuario, etc.
Considere el cliente móvil para la tienda en línea.
Primera pregunta, ¿debería preferir JWT sobre el primer tipo de token? En la medida en que necesite un usuario de inicio de sesión / cierre de sesión en el cliente móvil, necesito almacenar un token en algún lugar o, en el caso de JWT, el token debe invalidarse al cerrar sesión. Se utilizan diferentes enfoques para invalidar el token, uno de los cuales es crear una lista de tokens no válida (lista negra). Hmm La tabla / archivo tendrá un tamaño mucho mayor que si el token se almacenara en la tabla y se asociara con el usuario, y simplemente se eliminara al cerrar sesión.
Entonces, ¿cuáles son los beneficios del token JWT?
Segunda pregunta sobre OAuth, ¿debería usarla en caso de comunicación directa con mi servidor? ¿Cuál es el propósito de una capa más entre el cliente y el servidor solo para emitir token, pero la comunicación no será con el servidor oauth sino con el servidor principal? Según tengo entendido, el servidor OAuth es responsable solo de otorgar permisos de aplicaciones de terceros (tokens) para acceder a la información privada del usuario. Pero mi aplicación de cliente móvil no es de terceros.