Así que escribí una aplicación ficticia, un formulario de inicio de sesión escrito en angular2, esto publica el nombre de usuario y la contraseña en una API de descanso. Si las credenciales son correctas, la API devuelve un JWT (codificado en el JWT con varios permisos). El JWT se guarda en el almacenamiento del navegador local.
Esto funciona absolutamente bien, el JWT se almacena en el almacenamiento local (según las guías que he leído en línea) y se puede acceder a cualquiera con un poco de conocimiento del navegador (elemento de inspección, recursos de vista, etc.), y una vez que acceda al El token JWT, se puede descifrar fácilmente sin el uso de una clave.
En mi aplicación angular2, decodifica la clave. Si la clave contiene "valor1 = Verdadero", permite al usuario acceder a cierta parte del sitio web. Si el valor de la clave es falso, devuelve al usuario a la página de inicio con un mensaje de acceso denegado. Nuevamente funciona bien en mi configuración de prueba.
Como la clave solo se almacena localmente, puedo crear un JWT en cualquier lugar, pegarlo en el almacenamiento local de mis navegadores con las credenciales correctas y luego puedo acceder a las áreas restringidas del sitio web.
¿He perdido algo, ya que esto realmente no parece seguro? Digamos que mi aplicación estaba en línea en mynewapp.com y el área mynewapp.com/private estaba protegida con esta autenticación JWT, la aplicación verificó un JWT válido, si se encuentra un token JWT válido, inspecciona el token, para ver si contiene los permisos relevantes para acceder a esta área, si no lo hace, qué es lo que impide que la persona detrás del navegador modifique el contenido del almacenamiento local de los navegadores para manipular los datos para acceder a esta área prohibida.
La única forma en que puedo pensar es:
Si JWT existe, realice una llamada a la API al servidor REST, si el usuario con JWT tiene permiso para acceder al área solicitada, devuelva verdadero y permita que la solicitud continúe dentro de Angular
De lo contrario, REST Api devuelve falso y el usuario no puede continuar.