Instrucciones para obtener una copia del proyecto en funcionamiento en tu máquina local para propósitos de desarrollo y pruebas.
Para trabajar usaremos una máquina virtual, aunque se puede trabajar en Windows, Linux u OS X.
La máquina para que nos funcione correctamente como mínimo tendrá 2GHz de procesador, 4GB de RAM y 25GB de HD. Además instalaremos la última versión estable de 64 bits de Ubuntu.
Toda la práctica está explicada para la 20.04 LTS. Podemos verificar los parámetros con los comandos:
$ lab_release -a
$ uname -m
$ df -h
Si usamos el gestor VirtualBox podemos usar la imagen ISO de la última versión de Ubuntu. Es recomendable instalar las extensiones del gestor (desde VirtualBox le diremos que monte el disco con el nuevo software).
Una vez tengamos nuestra máquina preparada ya podemos empezar a instalar todos los programas que necesitemos
Para la ejecución de esta práctica se necesita tener:
- NodeJS (con express, cors, bcrypt, moment y jwt-simple)
- Git
- Code (o similar)
- MongoBD (con mongodb y mongojs)
- Nodemon
- Morgan
- Postman
- Apache2
Instalamos los programas
$ sudo snap install --classic code
$ sudo apt install npm
$ sudo apt install git
$ sudo snap install postman
$ sudo apt install apache2
$ sudo apt install -y mongodb
Trabajaremos en la carpeta api-auth-reg
$ mkdir api-auth-reg
$ cd api-auth-reg
Instalamos las bibliotecas
$ npm i -S express
$ npm i -D nodemon
$ npm i -S morgan
$ npm i -S mongodb
$ npm i -S mongojs
$ npm i -S bcrypt
$ npm i -S moment
$ npm i -S jwt-simple
$ npm i -S cors
Preparamos algunos programas:
$ sudo npm clean -f
$ sudo npm i -g n
$ sudo n stable
Si queremos comprobar las versiones
$ node --version
$ npm -v
Para crear nuestra aplicación node+express incorporamos en index.js
:
const express = require('express');
$ git config --global user.name gsl21
$ git config --global user.email gsl21@alu.ua.es
Depende de si partimos de un repositorio o no haremos unos comandos u otros. En nuestro caso al empezar de 0 haremos lo siguiente:
$ git init
$ echo "# Servivio Web RESTFUL de Registro y Autenticación" > README.md
$ git remote -v
$ git remote add origin https://guthub.com/solsolet/api-auth-reg.git
$ git init //para poner nuestros datos en el package.json
Para subir nuestro progreso al repositorio haremos
$ git status
$ git add .
$ git commit -m "Nombre del commit"
$ git push -u origin master
Con Code incluimos en el archivo package.json
en la sección de scripts para que invoque nodemon.
"start": "nodemon index.js",
Lo configuramos como un middleware de Node, así tendremos un logger en nuestra aplicación.
En nuestro index.js
pondremos:
const logger = require('morgan');
Iniciamos apache2 y mongoDB (puede ser en otra terminal):
$ sudo systemctl start apache2
$ sudo systemctl start mongodb
Podemos verificar el funcionamiento
$ mongo --eval 'db.runCommand({ connectionStatus: 1 })'
abrimos el gestor de la case de datos:
$ mongo --host 127.0.0.1:27017
> show dbs
Creamos el archivo index.js
.
$ touch index.js
Para empezar implementamos las funciones de GET, POST, PUT y DELETE para poder consultar, publicar modificar y borrar usuarios.
Para obtener tanto todos los usuarios del distema como uno determinado
Registramos un nuevo usuario con toda su información
Modificamos al usuario {id}
Eliminamos al usuarip {id}
Obtenemos todos los usuarios registrados en el sistema (versión reducida) o uno solo a partir de un token válido.
Realiza un SingIn o SingUp y devuelve un token válido.
En ambos hay que rellenar el body
de la petición en Postman con los campos requeridos y devolverá una respuesta en el formato result
, token
y usuario
.
api/auth: identifica al usuario con el email
y password
. Se requieren obligatoriamente.
Comprueba que exista el email en la BD y que el password coincida (en pass.service.js
las funciones se han vuelto síncronas para que funcione). También actualiza lastLogin
.
api/reg: registro mínimo de usuario con el nombre
, email
y password
. Se requieren obligatoriamente.
Comprueba que no exista el email en la BD y encripta el password. Añade signUpDate
, lastLogin
y guarda al usuario.
Para que nuestras opraciones sean seguras implementamos la carpeta cer donde está el certificado y la clave que usaremos en index.js
para hacer uso del protocolo https. Préviamente habremos instalado la librería de cors
const https = require('https');
const fs = require('fs');
const OPTIONS_HTTPS = { //declarar clau privada i certificat
key: fs.readFileSync('./cer/key.pen'),
cert: fs.readFileSync('./cer/cert.pen')
};
const cors = require('cors');
Luego hacemos unos cuantos middleware:
var allowMethods = (req,res,next) => {...}
var allowCrossTokenHeader = (req,res,next) => {...}
var allowCrossTokenOrigin = (req,res,next) => {...}
Y los usamos:
app.use(cors());
app.use(allowMethods);
app.use(allowCrossTokenHeader);
app.use(allowCrossTokenOrigin);
Para todas las funciones que necesiten de autorización añadiremos el parámetro de entrada auth.
Creamos nuestro repositorio. En 01_bcrypt.js
, importamos la librería bcrypt y ponemos nuestros datos para la simulación.
const bcrypt = require('bcrypt');
const miPass = 'miContraseña';
const badPass = 'miotraContraseña';
Creamos el Salt y lo utilizamos para generar el Hash
bcrypt.genSalt( ... ) => {
bcrypt.hash( ... )
}
Creamos el Hash directamente y compararemos con las contraseñas para ver qual es correcta
bcrypt.hash( miPass, 10, (err, hash) => {
if(err) console.log(err);
else {
...
// contr correcta
bcrypt.compare( miPass, hash, (err, result)=>{ ... });
// contrassenya incorrecta
bcrypt.compare( miPass, badPass, (err, result)=>{ ... });
};
});
Podemos hacer pruebas con moment
desde la terminal para ver alguna de sus funciones
$ date()
$ moment()
$ moment().unix()
Creamos una carpeta services y hacemos los archivos pass.services.js
y token.service.js
. En el primero encriptaremos el password y lo compararemos, en el segundo crearemos el token y lo decodificaremos.
Creamos fuera de services los archivos pass-test.js
, config.js
y jwt-test.js
.
Una vez picado el código correctamente, para su ejecución usaremos Postman y haremos las peticiones pertinentes. Todas ellas se encuentran en el archivo postam_collection.json
.
Podemos ver que en Auth está elegido el Type
Bearer Token y el token es el de un usuario cualquiera. Esta autorización es tratada con la función auth de index.js
.
- VS Code - Editor de texto
- Postman - Plataforma API
- MongoDB - Base de Datos
- NodeJS - Base de Datos
- Moment - Librería
- Bcrypt - Librería
- JWT-simple - Librería
Para todas las versiones disponibles, mira los tags.
- Gemma Sellés - Desarrollo de la práctica - gls21
Este proyecto no está bajo ninguna licencia.