· 7 years ago · Aug 16, 2018, 02:06 AM
1// Añadimos los módulos necesarios
2const FS = require('fs');
3const bodyParser = require('body-parser');
4const jsonServer = require('json-server');
5const JWT = require('jsonwebtoken');
6const middlewares = jsonServer.defaults()
7
8// Servidor Express
9const server = jsonServer.create();
10
11// Enrutador Express
12const router = jsonServer.router('./db.json');
13
14// Creamos un JSON con los usuarios (03f996214fba4a1d05a68b18fece8e71 == MD5 Hash 'usuarios' )
15const userdb = JSON.parse(FS.readFileSync('./03f996214fba4a1d05a68b18fece8e71.json', 'UTF-8'));
16
17// Middlewares predeterminados (logger, static, cors y no-cache)
18server.use(middlewares)
19
20// Parseo del body
21server.use(jsonServer.bodyParser);
22
23// Configuración TOKEN y duración
24const SECRET_KEY = 'zxcasdqwe098765';
25const expiresIn = '1h';
26
27// Crear un TOKEN desde un payload
28createToken = (payload) => JWT.sign(payload, SECRET_KEY, { expiresIn });
29
30// Verificar el TOKEN
31verifyToken = (token) => JWT.verify(token, SECRET_KEY, (err, decode) => decode !== undefined ? decode : err);
32
33// Comprobamos si el usuario existe en nuestra 'base de datos'
34isAuthenticated = ({ email, password }) => userdb.users.findIndex(user => user.email === email && user.password === password) !== - 1;
35
36// Creamos un ENDPOINT para comprobar si el usuario existe y poder crear y enviar un TOKEN
37server.post('/auth/login', (req, res) => {
38 const { email, password } = req.body;
39 if (isAuthenticated({ email, password }) === false) {
40 const status = 401;
41 const message = 'Contraseña y/o password incorrectos';
42 res.status(status).json({ status, message })
43 console.log(message);
44 return;
45 }
46 const access_token = createToken({ email, password });
47 res.status(200).json({ access_token })
48});
49
50// Añadir un middleware Express que verifique si el encabezado de autorización.
51// Luego verificara si el token es válido para todas las rutas, excepto la ruta anterior,
52// ya que esta es la que usamos para iniciar sesión en los usuarios.
53server.use(/^(?!\/auth).*$/, (req, res, next) => {
54 if (req.headers.authorization === undefined || req.headers.authorization.split(' ')[0] !== 'Bearer') {
55 const status = 401;
56 const message = 'Header con autorización incorrecta';
57 res.status(status).json({ status, message });
58 console.log(message);
59 return;
60 }
61 try {
62 verifyToken(req.headers.authorization.split(' ')[1]);
63 next();
64 } catch (err) {
65 const status = 401;
66 const message = 'Error: TOKEN de acceso no válido';
67 res.status(status).json({ status, message });
68 console.log(message);
69 }
70})
71server.use(router);
72
73server.listen(3000, () => {
74 console.log('API REST FUNCIONANDO')
75});