Tengo clientes que son todos los navegadores. Todos los clientes renderizan una sola aplicación de página obteniendo datos de una API web. El diseño de la API sigue los principios de REST.
Uso la autenticación basada en token sin OAuth porque no tengo terceros para mi API y quiero sentir cómo la seguridad puede dañar mi cerebro ;-)
El formato de mi token que emito es Json Web Token (JWT): contiene el ID de usuario, el tiempo de vida (fecha de exp), el emisor y la clave de firma (alg: HS256, que es SHA-256 hash algo)
El token es válido por 7 días. Así que el usuario tiene que volver a autenticarse cada 7 días. (Quizás esa no sea todavía la solución final en este campo ...)
Este es mi flujo de autenticación:
1) Utilizo la autenticación básica sobre SSL para mi punto final de inicio de sesión
2) Si el nombre de usuario y la contraseña enviados por el usuario son válidos, puse un token en la respuesta
3) Este token se almacena en el almacenamiento local / de sesión en el lado del cliente
4) Cada solicitud adicional a un punto final de recurso de la API del servidor debe incluir un token válido; de lo contrario, la solicitud obtiene un 401 y vuelve a ver la vista de inicio de sesión.
5) Antes de realizar una investigación adicional con el token como para verificar su fecha de vencimiento, necesito saber si la autenticidad del token sigue siendo válida o si un usuario legítimo lo ha modificado. Esto supone que el token se firmó con una clave antes de lo que llamamos MAC (Código de autenticación de mensaje)
Valido el token con la misma clave de firma que el token se firmó durante la creación del token. Almaceno la clave de firma que es un grupo de números generados aleatoriamente en la tabla sql de usuario que pertenece a userId. El ID de usuario que obtengo del token se ve arriba. O mejor dicho, almaceno el hash de la clave (matriz de bytes) en la tabla de usuario hash con BCrypt.
Pregunta :
-
¿Hay algo mal que hago?
-
¿Debo almacenar el token completo en la base de datos en lugar de solo la clave de firma y cuál es la ventaja?