Anexsoft | Blog y dictado de cursos de Tecnología

En este encontrarás tutoriales de tecnología como PHP, ASP.NET MVC, Front-End, entre otros y cursos exigentes de modalidad online que te ayudarán a crecer profesionalmente.

Autenticación usando Json Web Token
Actualizado el 27 Febrero, 2016 y leído 6,266 veces
Calificación: 9.43 / 10

Autenticación usando Json Web Token

Anexsoft

Señores, en esta entrada vamos hablar de la autenticación por Token y en eso nos vamos a quedar "solo vamos hablar", luego en futuras publicaciones vamos a implementarlo usando PHP y ASP.NET MVC.

 

Autenticación mediante el uso de sesiones

En la mayoría de los sistemas, se maneja la misma lógica para autenticarse con el sistema, la cual es la siguiente:

  1. Ingresas tus credenciales
  2. Validamos que estan sean correctas
  3. Guardamos en una sesión al usuario logeado.

Esto está genial, el tema es que perdemos performance y escalabilidad. ¿Por qué?, porque tener varios usuarios logeados van a consumir memoria RAM y esto haría que el aplicativo colapse o se vuelva inestable. Por otro lado, hablamos de escalabilidad porque hoy en día nuestras App son escalables a diferentes plataformas y/o tecnologías (smartphones, SPA, tablets) por lo cual tendríamos que ver la manera de resolver la sesión para cada dispositivo. ¿No sería más práctico de hacer que la tecnología permita integración sin importar para que plataforma desarrollas?

 

Implementación de Rest API y Token

Para dar solución a este problema y poder crear un backend que permita ser reutilizado y consumido por cualquier plataforma se logra gracias a la implementación de una Rest API, y para evitar manejar una sesión por cada dispositivo usamos la autentificación mediante token (en nuestro caso usamos Json Web Token o JWT).

La lógica es la siguiente:

  • Mi app se comunica con el API pasando credenciales (usuario y password), o logeando por proveedores como Facebook, Twitter.
  • Verificamos que tenga acceso al sistema.
  • Generamos un Token (este contiene información cifrada del usuario).
  • Cada app que quiera comunicarse con nuestra API deberá pasarle siempre el Token para que nuestra API al resolverlo pueda validar que es correcta.
    Ejm: si vamos a listar los últimos usuarios registrados, dentro de esta petición debemos enviar el Token generado para que nuestra Api antes de retornar lo solicitado deberá validar si el Token es correcto.

 

Después de obtener el Token, ¿qué hago con este?

Hasta este punto hemos resuelto el problema de escalabilidad y del uso de las sesiones para nuestro servidor. Ahora vamos a ver 2 posibles escenarios para comunicarnos con nuestra Api mediante la autenticación por Token:

  • Desarrollo full javascript: si llegamos a este punto es porque estamos construyendo una app que use solo javascript ya sea usando algun framework SPA o por nuestra cuenta, lo mejor es guardar el Token obtenido en el LocalStorage. Ahora, cada vez que hagamos una petición a nuestra Api (AJAX), deberemos pasar el Token dentro de las cabeceras del petición para que nuestra API lo pueda resolver y validar que sea correcto.
  • Desarrolo tradicional: tenemos un desarrolo tradicional, por ejemplo usando PHP o ASP.NET MVC. Entonces lo que vamos hacer es guardar el Token obtenido en la Cookie para leerla facilmente desde el lado del servidor y pasarlo en cada petición que hagamos a nuestra API.

Con esto creo que tenemos resuelto a nivel conceptual el tema de donde guardo el Token, lo que faltaría ver más adelante es como recibo, almaceno y leo y devuelvo dicho Token a mi Api pero eso lo veremos más adelante.

 

Json Web Token

JWT es simplemente un formato serializado que permite mantener información para la persona que se autenticado, información como: por cuanto tiempo va a estar autenticado, quien se autenticó entre otros.

El token generado puede ser algo como el que veremos a continuación, el cual es una cadena divida en 3 partes encriptadas en Base 64.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJNb3ppbGxhXC81LjAgKFdpbmRvd3MgTlQgNi4xOyBXT1c2NCkgQXBwbGVXZWJLaXRcLzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZVwvNDguMC4yNTY0LjEwOSBTYWZhcmlcLzUzNy4zNiIsImlhdCI6MTQ1NTU1MDIxMSwiZXhwIjoxNDU1NTUzODExLCJhdWQiOiIzMGE3NWU0OGYwNTEyNzM1Y2UwNTY5ODRmMGRlNDM4OWE5MzEyMGExIiwiZGF0YSI6eyJyZXNwb25zZSI6dHJ1ZSwibWVzc2FnZSI6IiIsImVycm9ycyI6W10sInJlc3VsdCI6eyJpZCI6IjEiLCJOYW1lIjoiRWR1YXJkbyIsIkxhc3ROYW1lIjoiUm9kcmlndWV6IiwiQWdlIjoiMjgifX19.KgrzgrYFOLgO52xQC9XLOzQ2xivh1ElEJEgc0qMOXIE
  1. Header: este contiene la información del tipo de token que se ha usado y el algoritmo que se uso para codificar.
    {
        "typ": "JWT",
        "alg": "HS256"
    }

    Hace referencia hasta el primer punto encontrado:
    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

  2. Payload: este está compuesto por los JwT Claims, los cuales van a definir las caracteristicas o cualidades de nuestro token. En este punto podemos guardar el ID, Nombre, Correo del usuario logeado (no guarar contraseñas u otros datos vitales). Veamos un ejemplo:

    • data: lo usaremos para guardar información del usuario.

    • iat: la fecha en la que se generó el token.

    • exp: la fecha hasta que el token será válido.

    • aud: este valor lo usaremos como una validación, para asegurarnos que nuestra Api solo puede ser accedida por la persona que le entregó el Token. (Luego explicaremos como hacemos ese punto).

    • {
          "iss": "Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/48.0.2564.109 Safari\/537.36",
          "iat": 1455550211,
          "exp": 1455553811,
          "aud": "30a75e48f0512735ce056984f0de4389a93120a1",
          "data": {
              "response": true,
              "message": "",
              "errors": [],
              "result": {
                  "id": "1",
                  "Name": "Eduardo",
                  "LastName": "Rodriguez",
                  "Age": "28"
              }
          }
      }

      Hace referencia al siguiente texto:

      eyJpc3MiOiJNb3ppbGxhXC81LjAgKFdpbmRvd3MgTlQgNi4xOyBXT1c2NCkgQXBwbGVXZWJLaXRcLzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZVwvNDguMC4yNTY0LjEwOSBTYWZhcmlcLzUzNy4zNiIsImlhdCI6MTQ1NTU1MDIxMSwiZXhwIjoxNDU1NTUzODExLCJhdWQiOiIzMGE3NWU0OGYwNTEyNzM1Y2UwNTY5ODRmMGRlNDM4OWE5MzEyMGExIiwiZGF0YSI6eyJyZXNwb25zZSI6dHJ1ZSwibWVzc2FnZSI6IiIsImVycm9ycyI6W10sInJlc3VsdCI6eyJpZCI6IjEiLCJOYW1lIjoiRWR1YXJkbyIsIkxhc3ROYW1lIjoiUm9kcmlndWV6IiwiQWdlIjoiMjgifX19

       

  3. Signature: este es una mezcla de los 2 atributos anteriores encriptados en el algoritmo que hemos elegido, en nuestro caso "HS256". Del caso que no sea igual, nuestra Api arrojaría un error dando por invalida la autenticación.
    Hace referencia a:

    KgrzgrYFOLgO52xQC9XLOzQ2xivh1ElEJEgc0qMOXIE

     

De esta manera tenemos una autenticación vía Token el cual lo podemos reutilizar en cualquier plataforma, ya que es un estandard y podemos descargar librirerías que permitan trabajar con JWT de manera práctica.

Si bien JWT es una gran ventaja para nuestra aplicación la cual nos ayuda a excluir el uso de las sesiones, su principal desventaja vendría ser la curva de aprendizaje y experiencia que se tiene para poder implementarlo correctamente.

Cualquier duda que tengan me dejan un comentario.

¡Adquiera ya!

  • Software de Venta e Inventario hecho en PHP y Codeigniter

    Software de Venta e Inventario hecho en PHP y Codeigniter
  • Código de fuente de Red Social desarrollada en ASP.NET MVC

    Código de fuente de Red Social desarrollada en ASP.NET MVC

Últimas publicaciones

Encuesta

¿Cómo nos conociste?

Síguenos

Estudia con nosotros y crece profesionalmente

Nuestros cursos han sido hecho en base a lo que demanda el mercado hoy en día.
La experiencia obtenida es la de un ambiente laboral.

Anexsoft
© 2017 Anexsoft, blog y cursos online de TI.