API de autenticación utilizando tokens web json jwt-simple

Estoy usando jwt-simple para crear una clave api. Básicamente lo que hace es encode(secret+data) y lo envía adjuntando con la solicitud. Soy consciente de que el servidor decode(encode(secret+data)) y verificará que es una solicitud válida. Código de ejemplo encontrado en la documentación jwt-simple :

 var jwt = require('jwt-simple'); var payload = { foo: 'bar' }; var secret = 'xxx'; // encode var token = jwt.encode(payload, secret); // decode var decoded = jwt.decode(token, secret); console.log(decoded); //=> { foo: 'bar' } 

Mis preguntas son:

  • ¿No podría alguien acceder a la API si conocen el token generado por encode(data+key) ? ¿Es por eso que debería usar HTTPS sobre HTTP?
  • Creo que también necesito almacenar el secreto de cada usuario en el servidor, ya que será necesario para decodificar. ¿Dónde debo guardarlo si no estoy en lo correcto?
  • ¿Cómo puedo enviar múltiples solicitudes de API? ¿Hay alguna otra forma mejor que enviar la clave API para cada solicitud?

Gracias por adelantado.

Consulte esta publicación con respecto a su confusión con el secreto: ¿Puede alguien decodificar un token web JSON (JWT) sin una clave secreta?

En cuanto a sus preguntas:

  1. Sí, todos los que de alguna manera logran obtener un token válido pueden acceder a su API. Entonces, si alguien conoce la clave secreta que usa para firmar sus tokens y puede crear una carga útil válida, puede usar la API. Pero el flujo habitual sería: un usuario inicia sesión, usted verifica la contraseña, si es la contraseña correcta, le da un token válido. Si alguien toma ese token de la computadora de ese usuario, no hay mucho que puedas hacer. Pero puedes hacer que los tokens caduquen, así que si alguien roba uno, no es válido por mucho tiempo.

  2. Puede firmar sus tokens con el mismo secreto de toda la aplicación, pero usaría una carga útil específica única para cada usuario para que cada usuario reciba un token diferente.

  3. En una solución simple, solo enviaría el token con cada llamada que realice a la API (además de iniciar sesión y registrarse). Existen otras soluciones para establecer sesiones, pero creo que son un poco más difíciles de implementar.