Estoy buscando implementar la autenticación REST sin estado en una API. He estado leyendo sobre artículos aquí, y he implementado una idea que funciona, pero esperaba obtener alguna información sobre su seguridad y posibles mejoras.
-
La autenticación inicial ocurre a través de la Autenticación básica HTTPS. El nombre de usuario y la contraseña se proporcionan en texto simple.
-
El servidor genera y proporciona un token que se proporciona al cliente, pero no se almacena en la base de datos. Todos los artículos que he leído en tokens de autenticación sugieren que no se almacene el token en sí mismo , sino algún valor que se pueda incluir en otro valor (el nombre de usuario, etc.) para generar el token nuevamente y validarlo, pero pensó que el punto de una API REST era no tener estado, y no almacenaría algún tokens / valores relacionados con la autenticación?
-
Este token se usa para solicitudes posteriores en lugar de requerir siempre el nombre de usuario / contraseña en los encabezados.
El token
El token se genera mediante:
encrypt(username, salt, hash, expirationDate)
Donde encrypt
es reversible usando actualmente un DES Cipher
, pero en el futuro posiblemente una clave privada o un recurso almacenado en el servidor que se pueda reemplazar fácilmente sin depender de un valor en el código fuente .
El beneficio es que esto le permite al servidor descifrar el token entrante y comparar el salt / hash con lo que está almacenado en el objeto del modelo User
. (Que tiene las propiedades salt
y hash
almacenadas en la base de datos).
Las preocupaciones que tengo con esto:
-
Si se conocen la clave privada o la contraseña
Cipher
, estos tokens se pueden falsificar. -
He considerado usar
password
en lugar desalt
yhash
, pero no me gustó la idea de que se conocepassword
si se encuentra la clave privada o la contraseñaCipher
.
Entonces: ¿Hay una mejor manera de realizar este tipo de autenticación de token "descifrable"? Y, ¿vale la pena mantener este objetivo "sin estado" de REST, o debería simplemente almacenar alguna versión con hash del token y nombre de usuario (pero no el token en sí mismo) en la base de datos y lanzar el "sin estado ¿"idea fuera de la ventana"?