¿Qué tan seguro es mantener un token en angular para futuras solicitudes a una API de Laravel?

1

Tengo un front-end Angular JS que consume servicios web de una API desarrollada con Laravel 5.

INFORMACIÓN DE ANTECEDENTES 1

Cuando el usuario inicia sesión, si tiene éxito, la API devuelve un token y el token es así:

$token = base64_encode("mail=" . $mail); 
return Response::json(["token" => $token, 'error' => null]); 

Luego tengo una función en un servicio angular que sabe cómo trabajar con el token.

INFORMACIÓN DE ANTECEDENTES 2

Cada vez que un usuario necesita obtener datos, la API toma el correo que se envía a la solicitud como una de las solicitudes de encabezados. En Laravel, tengo un Middleware que toma ese token y hago las siguientes validaciones:

  1. El token está dentro de los encabezados (en el encabezado de autorización)
  2. El token es un token válido
  3. El correo electrónico recuperado por el token existe en la base de datos

Si falla alguna de estas validaciones, la API envía una solicitud incorrecta 422 con algún error.

PREGUNTA

Mi verdadera preocupación acerca de esto es, ¿es posible que alguien piratee mi sitio web? ¿Es posible que alguien (conociendo el correo electrónico de otra persona en el sitio web) cambie el encabezado de autorización que contiene el correo electrónico?

NOTA

En teoría, el usuario obtiene un token si tuvo un inicio de sesión exitoso, si no lo hizo, no lo obtendrán.

    
pregunta ggderas 07.04.2016 - 01:36
fuente

2 respuestas

1

La diferencia con su token (dirección de correo electrónico codificada en base64) y un JWT es que para un JWT es mucho más difícil crear un token para otro usuario. Con su token, puedo codificar fácilmente cualquier otra dirección de correo electrónico y obtener un token válido. Sin embargo, un JWT está firmado criptográficamente para que solo pueda crear uno si tiene una clave secreta, que permanece en el servidor.

Si desea una solución segura, puede ser mejor usar alguna biblioteca que implemente tokens seguros como JWT.

    
respondido por el Sjoerd 07.04.2016 - 10:32
fuente
2

Teniendo en cuenta que parece que solo la Base 64 codifica el correo electrónico, se omite fácilmente.

No intentes reinventar la rueda, especialmente por seguridad.

Utilice una biblioteca de autenticación conocida. Después de autenticar a un usuario, luego recupere los datos del almacenamiento en función de su identidad autenticada y transmítalos según sea necesario.

Editar Si desea continuar con este enfoque, debe incluir un token de validación con su json en las siguientes líneas:

  • En el punto de inicio de sesión, hash un secreto (del lado del servidor) concatenado con el correo electrónico del usuario para producir un token de validación.
  • Enviar el token al cliente
  • Cuando llega una solicitud con un token, puede verificar que no se haya alterado el correo electrónico repitiendo el primer paso anterior y rechazando la solicitud si el token de validación no coincide.

Esto evita la manipulación del correo electrónico, aunque no impide que alguien robe el token y lo use en un ataque de repetición, etc., etc.

    
respondido por el Nathan 07.04.2016 - 01:56
fuente

Lea otras preguntas en las etiquetas