From 2b232f2c03d85186eda447f8ae2bec22e50531c0 Mon Sep 17 00:00:00 2001 From: alfredojl Date: Mon, 17 Aug 2020 11:35:15 -0500 Subject: [PATCH] Login --- .env | 4 ++ package-lock.json | 31 +++++++++++++-- package.json | 1 + scratch/token | 1 + server/config/test.js | 18 ++++----- server/controller/login/post.js | 59 +++++++++++++++++++++++----- server/middlewares/authentication.js | 28 +++++++++++++ server/models/install.js | 59 +++++++++++++++++++--------- server/models/tablas/Admin.js | 35 +++++++++-------- server/routes/login.js | 32 +++------------ 10 files changed, 183 insertions(+), 85 deletions(-) create mode 100644 scratch/token create mode 100644 server/middlewares/authentication.js diff --git a/.env b/.env index 1083523..ca88168 100644 --- a/.env +++ b/.env @@ -7,3 +7,7 @@ USERDB = censoDev PASSDB = holaC3ns0 HOSTDB = localhost + +TOKEN_SEED = seedAcatlan + +TOKEN_EXP = 1d \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2166a56..f82cc35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -823,8 +823,7 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "has-flag": { "version": "3.0.0", @@ -899,8 +898,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflection": { "version": "1.12.0", @@ -1390,6 +1388,26 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz", "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg==" }, + "node-localstorage": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.1.6.tgz", + "integrity": "sha512-yE7AycE5G2hU55d+F7Ona9nx97C+enJzWWx6jrsji7fuPZFJOvuW3X/LKKAcXRBcEIJPDOKt8ZiFWFmShR/irg==", + "requires": { + "write-file-atomic": "^1.1.4" + }, + "dependencies": { + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + } + } + }, "node-pre-gyp": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", @@ -1891,6 +1909,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, "sqlstring": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", diff --git a/package.json b/package.json index adb93e3..489b334 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "mariadb": "^2.4.2", "moment": "^2.27.0", "mysql2": "^2.1.0", + "node-localstorage": "^2.1.6", "sequelize": "^6.3.4" }, "devDependencies": { diff --git a/scratch/token b/scratch/token new file mode 100644 index 0000000..532c983 --- /dev/null +++ b/scratch/token @@ -0,0 +1 @@ +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkQWRtaW4iOjIsIm5hbWUiOiJhbGZyZWRvamwiLCJwYXNzd29yZCI6IiQyYiQxMCRlbXlCSGMxSUROWmpKcHU1aEJnVzB1QzJ1ZGZYbFJRY1NkSUhSVTZyNGNHOTZvOGdHa2p1UyIsImlzQWRtaW4iOmZhbHNlLCJjcmVhdGVkQXQiOiIyMDIwLTA4LTE1VDE3OjQ5OjA2LjAwMFoiLCJ1cGRhdGVkQXQiOiIyMDIwLTA4LTE1VDE3OjQ5OjA2LjAwMFoifSwiaWF0IjoxNTk3NjIxNDAzLCJleHAiOjE1OTc3MDc4MDN9.TjRxq5nn4EEYCu38BD_AeLbRVY6w6IeWCwNWhEgnS9U \ No newline at end of file diff --git a/server/config/test.js b/server/config/test.js index b480aa1..96c81a9 100644 --- a/server/config/test.js +++ b/server/config/test.js @@ -4,12 +4,12 @@ const sequelize = require("./sequelize.conf"); const colors = require("colors"); sequelize - .authenticate() - .then(() => { - console.log("Conexión establecida con éxito.".green); - process.exit(); - }) - .catch(err => { - console.error("No se ha podido establacer conexión con la base de datos:".red, err); - process.exit(); - }); + .authenticate() + .then(() => { + console.log("Conexion establecida con exito.".green); + process.exit(); + }) + .catch(err => { + console.error("No se ha podido establacer conexion con la base de datos:".red, err); + process.exit(); + }); \ No newline at end of file diff --git a/server/controller/login/post.js b/server/controller/login/post.js index 131e242..4c4f3e2 100644 --- a/server/controller/login/post.js +++ b/server/controller/login/post.js @@ -1,15 +1,54 @@ -// const post = async () => { - -// return { -// message: 'Mensaje del post' -// } -// } - -// module.exports = post; - const Admin = require("../../models/tablas/Admin"); const bcrypt = require("bcrypt"); const jwt = require("jsonwebtoken"); -// module.exports = const equis; \ No newline at end of file + +const post = async(req, res) => { + + const body = req.body; + + const user = await Admin.findOne({ + where: { + name: body.name, + }, + }); + + if (user == null) { + console.log("not found!"); + return res.status(500).json({ + err: { + message: `No se pudo encontrar «${body.name}»` + } + }) + } + + if (!bcrypt.compareSync(body.password, user.password)) { + console.log('Wrong password'); + return res.json({ + err: { + message: 'Wrong password' + } + }) + } + + let token = jwt.sign({ + user + }, process.env.TOKEN_SEED, { expiresIn: process.env.TOKEN_EXP }); + + if (typeof localStorage === "undefined" || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + localStorage.setItem('token', token); + + + res.json({ + user, + token + }) + + +} + +module.exports = post; \ No newline at end of file diff --git a/server/middlewares/authentication.js b/server/middlewares/authentication.js new file mode 100644 index 0000000..71731cd --- /dev/null +++ b/server/middlewares/authentication.js @@ -0,0 +1,28 @@ +const jwt = require('jsonwebtoken'); + +const verifyToken = (req, res, next) => { + + if (typeof localStorage === "undefined" || localStorage === null) { + var LocalStorage = require('node-localstorage').LocalStorage; + localStorage = new LocalStorage('./scratch'); + } + let localToken = localStorage.getItem('token'); + + console.log(localToken); + + jwt.verify(localToken, process.env.TOKEN_SEED, (err, decoded) => { + if (err) { + return res.status(401).json({ + err: { + message: 'Invalid token.' + } + }) + } + + req.user = decoded.user; + + next(); + }) +} + +module.exports = verifyToken; \ No newline at end of file diff --git a/server/models/install.js b/server/models/install.js index 2a7217c..4a80c8d 100644 --- a/server/models/install.js +++ b/server/models/install.js @@ -7,35 +7,56 @@ const admin = require("./tablas/Admin"); require("../config/config"); async function remove() { - console.log(logSymbols.info, "Paso 1 : Borrando base de datos \n".blue.bold); + console.log(logSymbols.info, "Paso 1 : Borrando base de datos \n".blue.bold); - await admin.drop(); - console.log(logSymbols.success, "admin"); + await admin.drop(); + console.log(logSymbols.success, "admin"); } async function install() { - console.log( - logSymbols.info, - "Paso 2 : Instalando base de datos \n".blue.bold - ); + console.log( + logSymbols.info, + "Paso 2 : Instalando base de datos \n".blue.bold + ); - await admin.sync(); - console.log(logSymbols.success, "admin"); + await admin.sync(); + console.log(logSymbols.success, "admin"); + + //crear clave foranea de una tabla a otra, ejemplo + // responsable.hasMany(programa, { + // foreignKey: "idResponsable", + // }); + +}; + +async function createFirstUsers() { + console.log( + logSymbols.info, + "Paso 3 : Creating first users in database...\n".blue.bold + ); + + await admin.create({ + name: 'alima', + password: bcrypt.hashSync('contraseña', 10), + isAdmin: true + }); + + await admin.create({ + name: 'alfredojl', + password: bcrypt.hashSync('contraseña', 10), + isAdmin: false + }); -//crear clave foranea de una tabla a otra, ejemplo -// responsable.hasMany(programa, { -// foreignKey: "idResponsable", -// }); - } async function exec() { - await remove(); - await install(); + await remove(); + await install(); + await createFirstUsers(); - console.log(logSymbols.success, "Éxito al instalar \n".underline.bold.green); - process.exit(); + console.log(logSymbols.success, "Éxito al instalar \n".underline.bold.green); + process.exit(); } -exec(); +exec(); \ No newline at end of file diff --git a/server/models/tablas/Admin.js b/server/models/tablas/Admin.js index 5c543ff..04c07e2 100644 --- a/server/models/tablas/Admin.js +++ b/server/models/tablas/Admin.js @@ -2,27 +2,28 @@ const Sequelize = require("sequelize"); const sequelize = require("../../config/sequelize.conf"); class Admin extends Sequelize.Model {} -Admin.init( - { +Admin.init({ idAdmin: { - type: Sequelize.INTEGER, - primaryKey: true, - autoIncrement: true, - allowNull: false, + type: Sequelize.INTEGER, + primaryKey: true, + autoIncrement: true, + allowNull: false, }, - nombre: { - type: Sequelize.STRING(50), - allowNull: false, + name: { + type: Sequelize.STRING(50), + allowNull: false, }, password: { - type: Sequelize.STRING(100), - allowNull: false, + type: Sequelize.STRING(100), + allowNull: false, }, - }, - { + isAdmin: { + type: Sequelize.BOOLEAN, + allowNull: false + } +}, { sequelize, - tableName: "admin", - } -); + tableName: "users", +}); -module.exports = Admin; +module.exports = Admin; \ No newline at end of file diff --git a/server/routes/login.js b/server/routes/login.js index 3fd6c6c..11ab44f 100644 --- a/server/routes/login.js +++ b/server/routes/login.js @@ -1,38 +1,18 @@ let express = require("express"); let app = express(); +let verifyToken = require('../middlewares/authentication'); const route = '/login' //logica del login, ejemplo -let post = require('../controller/login/post') +let post = require('../controller/login/post'); +const Admin = require("../models/tablas/Admin"); //let get = require('../controller/login/get') -app.post(route, (req, res) => { - console.log(req.query) - console.log(req.body) - return post() - .then(data => { - res.status(200).json(data) - }) - .catch(err => { - console.log(err) - res.status(400).json({ - err: err.message - }) - }) -}) +app.post(route, async(req, res) => { + return post(req, res); -// app.get(route, (req, res) => { -// return get() -// .then(data => { -// res.status(200).json(data) -// }) -// .catch(err => { -// res.status(400).json({ -// err: err.message -// }) -// }) -// }) +}); module.exports = app \ No newline at end of file