Creando un JWT token con Node.js y Express

Vamos a crear un JWT Token con Node.js para ver un ejemplo práctico del artículo anterior de JSON Web Tokens . En este caso he elegido Javascript ya que la implementación es muy sencilla.  Lo primero que tendremos que hacer es instalar varias librerías de Node.

  • npm install express
  • npm install body-parser
  • npm install jsonwebtoken
  • npm install express-jwt

JWT Token y Node

Es momento de construir nuestra aplicación con Node.js:


var express = require('express');
var bodyParser=require('body-parser');
var jwt=require('jsonwebtoken');
var expressJwt=require('express-jwt');
var app = express();

var jwtClave="laclave_de_cecilio";
app.use(express.static('publica'));
app.use(bodyParser.json());
app.use(expressJwt({secret:jwtClave}).unless({path: ["/login"]}));


var usuario= {
 nombre:"cecilio",
 clave:"cecilio"
}
var noticias = [{
 id: 1,
 titulo: "noticia 1"
}];

app.get('/noticias', function(req, res) {
 res.send(noticias);
});


app.post("/login",function(request,response) {

if (request.body.nombre==usuario.nombre || request.body.clave==usuario.clave) {

 var token=jwt.sign({
 usuario:"cecilio"
 },jwtClave);

 response.send(token);

}else {

 response.status(401).end("usuario incorrecto")
}

});

app.listen(3000, function() {
 console.log('aplicacion en el puerto 3000!');
});

No es mucho código pero vamos a explicarlo. En primer lugar lo que más destaca es que disponemos de dos URL de acceso. Una es /login que servirá para logearnos en el servidor la otra es /noticias que nos devuelve una noticia.

JWT Token express

Ambas URL están protegidas por el módulo de express-jwt que se registra previamente y que hace la función de filtro o interceptor:


var jwtClave="laclave_de_cecilio";
app.use(expressJwt({secret:jwtClave}).unless({path: ["/login"] }));

Este módulo protege todas las URL salvo la url de Login y los recursos estáticos :

JWT Token

Cada vez que nosotros solicitemos la url de noticias nos devolverá acceso no permitido ya que no tenemos un token:

Así pues tenemos que construirnos una aplicación cliente que envíe una petición POST al servidor a la URL de Login y pase usuario “cecilio” y clave “cecilio”, esto nos devolverá un token:

app.post("/login",function(request,response) {

if (request.body.nombre==usuario.nombre || request.body.clave==usuario.clave) {

 var token=jwt.sign({
 usuario:"cecilio"
 },jwtClave);

 response.send(token);

}else {

 response.status(401).end("usuario incorrecto")
}

});

Vamos a construir un documento html en la carpeta pública del servidor que se apoye en jQuery y se encargue de realizar tanto la petición de login como la de las noticias:

 

JWT Token Folder

 


 <body>
 <input type="text" id="nombre" />
 <input type="text" id="clave" />

 <input type="button" id="login" value="login" />
 <input type="button" id="noticias" value="noticias" />
 </body>

Unicamente tenemos dos cajas de texto y dos botones (login,noticias) .

JWT Token formulario

El primer botón realiza una petición Ajax al servidor y nos devuelve un token. El segundo botón solicita las noticias. Vamos a ver el código de JavaScript creado con jQuery que es algo que todos entendemos.


$(document).ready(function() {


            var token = "";

            $("#login").click(function() {


                var usuario = {
                    nombre: $("#nombre").val(),
                    clave: $("#clave").val()
                };

                $.ajax({
                    url: 'login',
                    type: 'post',
                    contentType: 'application/json; charset=utf-8',
                    data: JSON.stringify(usuario),
                    success: function(data) {

                    token=data;


                    },
                    error:function(error) {

                      console.log(error);
                    }

                });

            });

            $("#noticias").click(function() {


                $.ajax({
                    url: 'noticias',
                    type: 'get',
                    contentType: 'application/json; charset=utf-8',
                    dataType: 'json',
                    success: function(data) {
                        console.log(data);
                    },
                    beforeSend: function(xhr) {

                        console.log(token);

                        xhr.setRequestHeader("Accept", "application/json");
                        xhr.setRequestHeader("Authorization", "Bearer "+token);
                    },

                });
            });

        });

El código no es muy complicado y únicamente gestiona dos eventos “login” y “noticias” . El primero de ellos solicita un token al servidor realizando una petición AJAX y enviando los datos en JSON. Cuando recibe la respuesta almacena el token en una variable global. El evento de noticias hace una petición al servidor solicitando las noticias y pasando el token que acabamos de obtener como parámetro en la cabecera.

De esta forma podremos acceder a los datos solicitando primero el JWT token para despues  imprimirlos en la consola:

Otros artículos relacionados:

It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

6 Responses to Creando un JWT token con Node.js y Express

  1. Carol 13 Marzo, 2017 at 15:55 #

    Muy bueno. Gracias

    • Cecilio Álvarez Caules 13 Marzo, 2017 at 18:15 #

      de nada 🙂

  2. Jona 3 Abril, 2017 at 4:23 #

    Extraordinario ejemplo Cecilio, me aclaro muchos conceptos.

    Muchas gracias por compartir tus conocimientos y entregar valor de primer nivel en el área de desarrollo web.

    Slds 😉

    • Cecilio Álvarez Caules 3 Abril, 2017 at 9:21 #

      me alegro que te haya sido de utilidad 🙂

  3. Arlen 12 Abril, 2017 at 19:21 #

    Excelente forma de explicarlo, mas claro no se puede. Lo entendí, muchas gracias

    • Cecilio Álvarez Caules 12 Abril, 2017 at 22:09 #

      de nada 🙂

Deja un comentario