Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/08/2015, 17:34
Avatar de jvier
jvier
 
Fecha de Ingreso: septiembre-2014
Mensajes: 106
Antigüedad: 9 años, 7 meses
Puntos: 6
Pregunta Dudas Json Web Token y Seguridad

Buen día foreros, pues ando por aquí con varias dudas sobre este sistema de autenticacion, tratare de ser lo mas claro posible.

Lo que entiendo es:
1.- para obtener un JWT es necesario hacer un login normal.
Una vez autenticado se genera el JWT con todas sus características que ustedes ya conocen. (encabezado, contenido y firma generada con su clave secreta) y se envía al cliente.

2.- el cliente recibe el token lo almacena de manera local y lo utilizara para todas las peticiones que le hará a la API donde requiera autenticacion.

3.- el servidor donde esta la API recibe la petición junto con el token y con su clave secreta descifra el token verificando así su integridad y sabiendo así a quien pertenece el token y permite la petición..

Bueno... se que en cierta parte es seguro porque se envía al cliente un token que es indescifrable si no tienes la clave secreta, si se cambian los datos del token al regresarlos a la API no harán efecto porque la firma no coincidirá y sera rechazada la petición, y pues en teoria si tienes un token valido es porque lo obtuviste haciendo login y el servidor te lo entrego, y si el servidor lo puede verificar es porque fue generado por el mismo con su clave secreta, y se supone que mientras la clave siga siendo secreta se puede confiar en el token... hasta ahí todo bien... pero!

1.- y si el token es obtenido por otra persona? es como si obtuvieran su contraseña! dirán algunos que el token expira.. si, pero mientras sea valido? se puede cambiar el password del usuario. (si añado la ip al token no estoy seguro si puedo solucionar esto)

2.- el token tiene fecha de expiracion, si estoy trabajando y a la mitad de mi trabajo expira mi token, al yo querer guardar mi trabajo no podre y perderé mi trabajo!
(posiblemente esto se solucione refrescando el token con cada petición reiniciando el tiempo de expiracion y usando tiempos de expiracion cortos, se tendría que estar enviando al cliente un nuevo token con cada peticion)

3.- como se cierra sesión? como no hay un estado, y el token solo es verificado al vuelo sin revisar en bases de datos, aunque el token se elimine del almacenamiento local, si alguien lo tiene podrá usarlo mientras no expire!

4.- y si el cliente cambia contraseña? como inhabilito el token actual si no hay estado? dirán que almacene los tokens en una base de datos para verificar los token inválidos, pero hay se perdería la escencia de este sistema que es el stateless, porque tendría que checar en base de datos en cada petición que hagan a la API que el token sea uno valido y no este en la lista negra, esta la opción de tiempos de expiracion cortos, pero entonces que no es mejor generar un nuevo token para el usuario con cada petición que haga a la API? y de todos modos al lograr obtener una copia del token antes de que expire se podría usar y al usarlo se refrescaría el token y seguiría siendo valido

Pues esas son mis dudas...
__________________
Me gusta desarrollar aplicaciones para Android, y me considero bueno para el PHP, Javascript y el AS3.

AH! y agradezco puntitos jeje (si mis respuestas te ayudan).