Tutorial de Programación Android – Login con NodeJS, Express y Json Web Token – Devolviendo el Json Web Token
De momento ya hemos visto en este Tutorial de Programación Android que nuestro proyecto es capaz de registrar usuarios y de loguearlos, cuando se lo ordenamos desde dentro. Ha llegado el momento de que nuestra API responda a las peticiones del exterior. En concreto vamos a ver como lograr que responda a las peticiones de Login. Hemos optado por una autentificación básica, en la que el email y el password del usuario a loguear van a ir en la cabecera de la petición codificadas en Base64. Más adelante veremos como hacer esto desde nuestra aplicación Android, pero de momento, vamos a ir comprobando el funcionamiento.
Vamos a añadir primero un archivo ‘config.json’ en la carpeta config, con este simple contenido:
{ "secret" : "NodeLoginAndroid" }
Posteriormente vamos a colocar una nueva ruta a nuestro archivo rutas.js, que quedaría de la siguiente manera:
var auth = require('basic-auth'); var jwt = require('jsonwebtoken'); var express = require('express'); var rutas = express.Router(); var registro = require('./funciones/registro'); var login = require('./funciones/login'); var config = require('./config/config.json'); rutas.get('/', function(req, res) { res.end('Bienvenido a la raiz de la api'); }); rutas.post('/autentificar', function(req, res) { var credenciales = auth(req); if (!credenciales) { res.status(400).json({ message: 'Petición no valida' }); } else { console.log(credenciales); login.Login(credenciales.name, credenciales.pass) .then(function(result) { var token = jwt.sign(result, config.secret, { expiresIn: 1440 }); res.status(result.status).json({ message: result.mensaje, token: token }); }, function(error) { res.status(error.status).json({ message: error.mensaje }); }); } }) exports.rutas = rutas;
Hemos añadido la importación del archivo config.json y una nueva ruta, en este caso ‘/autentificar’. Lo primero que haremos cuando nos llega una petición a esta ruta es comprobar, mediante auth(req) que parsea la cabecera, recoge la autorización y la devuelve en forma de objeto con dos propiedades: user y pass. Si algo no va bien retornará undefined y nosotros un status 400 de petición no válida.
Si las credenciales son válidas, se las pasamos a nuestra función de login que, recordemos, espera dos parámetros (email y password). Ella será la encargada de comprobar si coinciden y en caso de éxito ya sabemos que devolverá un status 200 y el email del usuario logueado. Con ese email y nuestra palabra secreta que definimos en config.json vamos a generar un token que devolveremos al usuario.
De ello se va a encargar el módulo de nodejs ‘jsonwebtoken’ que devolverá una cadena de texto firmada con nuestra palabra secreta, de manera que podamos verificar la autenticidad del mismo si conocemos la palabra secreta usada para firmarla. Un JWT consta de tres partes: Header, en la que va el tipo de token y el algoritmo de firma, payload, donde va la información que queremos transmitir y signature que incorpora la firma.
Una vez que tenemos todo junto, ejecutamos nuestro proyecto desde la raiz con el comando node index y con alguna extensión del navegador vamos a realizar la petición a nuestra nueva ruta. Yo he usado Simple REST Client de la manera que podéis ver en la siguiente imagen. Lo que veis después de basic en la cabecera de la petición no es más que una cadena de texto conteniendo email y password separados por dos puntos => pedro@prueba.com:prueba codificados en Base64. No suele ser muy elegante enviar contraseñas en texto plano:
La consola de la aplicación nos mostrará la siguiente salida:
Si ahora cogemos el token que nos ha devuelto nuestra api, lo podemos verificar fácilmente en https://jwt.io/. En nuestro caso particular, esto es lo que podemos ver:
Y una vez llegados hasta aquí, creo que en el siguiente capítulo del tutorial de Programación Android vamos a meternos con la creación de la aplicación móvil para Android que hará uso de las rutas que hemos configurado en nuestra API. Puedes consultar el resto de capítulos de este tutorial de programación Android y Javascript:
[wphtmlblock id=»517″]