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 la API aumentan cada día.
He intentado diferentes formas de autenticación, pero todavía tengo algunos malentendidos, así que necesito el consejo de alguien más experimentado.
Déjame decirte, cómo entiendo todo esto. Si entiendo algo incorrectamente, por favor hágamelo saber.
En cuanto a que la API REST no tiene estado, así como 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 utilizará para las solicitudes posteriores. La señal 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 servidor de solicitudes, se comprueba si el usuario tiene token y es el mismo que en la base de datos. Todo es bastante sencillo.
-
Token JWT. Este token es auto-descriptivo, contiene toda la información necesaria sobre el token, el usuario no puede cambiar, por ejemplo, la fecha de vencimiento o cualquier otra reclamación, ya que el token es generado (firmado) por el servidor con una palabra clave secreta. Esto también está claro. Pero un gran problema, personalmente para mí, 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 token con 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 rellenar los campos de registro con datos del usuario y así sucesivamente.
Considere el cliente móvil para la tienda en línea.
¿La primera pregunta debería preferir JWT sobre el token de primer tipo? Por lo que necesito 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 caso de JWT, el token debe ser invalidado al cerrar la sesión. Se utilizan diferentes enfoques para invalidar el token. Uno de ellos es crear una lista de token 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 estuviera asociado con el usuario, y se eliminara al cerrar la sesión.
Entonces, ¿cuáles son los beneficios del token JWT?
Segunda pregunta sobre OAuth, ¿debo 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 el token, pero la comunicación no será con un servidor real sino con el servidor principal? Según tengo entendido, el servidor OAuth es responsable solo de otorgar permisos (tokens) a aplicaciones de terceros para acceder a la información privada del usuario. Pero mi aplicación de cliente móvil no es de terceros.