From 2b232f2c03d85186eda447f8ae2bec22e50531c0 Mon Sep 17 00:00:00 2001 From: alfredojl Date: Mon, 17 Aug 2020 11:35:15 -0500 Subject: [PATCH 1/3] 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 From 1562ea1a77ffd86504060f4fbdd728e2c77d3c0b Mon Sep 17 00:00:00 2001 From: KIKIN Date: Wed, 19 Aug 2020 19:21:14 -0500 Subject: [PATCH 2/3] conectando archivos --- scratch/token | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scratch/token b/scratch/token index 532c983..fefe1be 100644 --- a/scratch/token +++ b/scratch/token @@ -1 +1 @@ -eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkQWRtaW4iOjIsIm5hbWUiOiJhbGZyZWRvamwiLCJwYXNzd29yZCI6IiQyYiQxMCRlbXlCSGMxSUROWmpKcHU1aEJnVzB1QzJ1ZGZYbFJRY1NkSUhSVTZyNGNHOTZvOGdHa2p1UyIsImlzQWRtaW4iOmZhbHNlLCJjcmVhdGVkQXQiOiIyMDIwLTA4LTE1VDE3OjQ5OjA2LjAwMFoiLCJ1cGRhdGVkQXQiOiIyMDIwLTA4LTE1VDE3OjQ5OjA2LjAwMFoifSwiaWF0IjoxNTk3NjIxNDAzLCJleHAiOjE1OTc3MDc4MDN9.TjRxq5nn4EEYCu38BD_AeLbRVY6w6IeWCwNWhEgnS9U \ No newline at end of file +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkQWRtaW4iOjIsIm5hbWUiOiJhbGZyZWRvamwiLCJwYXNzd29yZCI6IiQyYiQxMCRtTUlnR0NUUGlhU01ObnhmcnQ1bG5lV29xTlhQZVV5aGVFVEw4RFBOMU1nRENIT3lLeEsvRyIsImlzQWRtaW4iOmZhbHNlLCJjcmVhdGVkQXQiOiIyMDIwLTA4LTE3VDE5OjE3OjQ5LjAwMFoiLCJ1cGRhdGVkQXQiOiIyMDIwLTA4LTE3VDE5OjE3OjQ5LjAwMFoifSwiaWF0IjoxNTk3ODgyNjExLCJleHAiOjE1OTc5NjkwMTF9.J_VzUBKHZ4PWHjd2NVEOqjOgSWhEr2k4QWJyZzQORp4 \ No newline at end of file From 43a6d7be6f368cff1f19d99c3753573da11dd374 Mon Sep 17 00:00:00 2001 From: alfredojl Date: Fri, 21 Aug 2020 14:55:08 -0500 Subject: [PATCH 3/3] npm run sendemail --- .env | 6 +++- helpers/sendEmail.js | 48 +++++++++++++++++++++++++++ package-lock.json | 22 ++++++++++++ package.json | 59 +++++++++++++++++---------------- scratch/token | 2 +- server/controller/login/post.js | 8 ++--- 6 files changed, 111 insertions(+), 34 deletions(-) create mode 100644 helpers/sendEmail.js diff --git a/.env b/.env index ca88168..2c3f6e7 100644 --- a/.env +++ b/.env @@ -10,4 +10,8 @@ HOSTDB = localhost TOKEN_SEED = seedAcatlan -TOKEN_EXP = 1d \ No newline at end of file +TOKEN_EXP = 1d + +EMAIL = 'alfredo.jl323@gmail.com' + +EMAILPASS = 'Everybody56.' \ No newline at end of file diff --git a/helpers/sendEmail.js b/helpers/sendEmail.js new file mode 100644 index 0000000..3734efd --- /dev/null +++ b/helpers/sendEmail.js @@ -0,0 +1,48 @@ +const symbols = require('log-symbols'); +const generator = require('generate-password'); +const admin = require('../server/models/tablas/Admin'); +const bcrypt = require('bcrypt'); + +const send = require('gmail-send')({ + user: process.env.EMAIL, + pass: process.env.EMAILPASS, + subject: 'Credenciales para ingreso a sistema de censo.' +}); + +const emails = [ + 'alfredo.lima@acatlan.unam.mx', + '312047278@pcpuma.acatlan.unam.mx' +]; + +emails.forEach(async(email, index) => { + + // Para pruebas + await admin.sync({ force: true }); + + let tempPass = generator.generate({ + length: 8, + numbers: true, + symbols: true, + exclude: `"`, + strict: true + }); + console.log(symbols.info, `Creating user ${email}...`); + let tempUser = await admin.create({ + name: email, + password: bcrypt.hashSync(tempPass, 10), + isAdmin: false + }); + if (!tempUser) + return console.log(symbols.error, 'Error creating user. Exiting.'); + console.log(`Sending email to ${email}`); + await send({ + to: email, + text: `Usuario: ${email}\nContraseña: ${tempPass}\nSaludos.` + }, + async(err, res, resFull) => { + if (err) + return console.log(symbols.error, err); + console.log(symbols.success, 'User created. Email sent.'); + }); + +}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f82cc35..70b06bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -761,6 +761,12 @@ "is-property": "^1.0.2" } }, + "generate-password": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/generate-password/-/generate-password-1.5.1.tgz", + "integrity": "sha512-XdsyfiF4mKoOEuzA44w9jSNav50zOurdWOV3V8DbA7SJIxR3Xm9ob14HKYTnMQOPX3ylqiJMnQF0wEa8gXZIMw==", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -801,6 +807,16 @@ "ini": "^1.3.5" } }, + "gmail-send": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/gmail-send/-/gmail-send-1.8.10.tgz", + "integrity": "sha512-QMpWwzeA64U69HzOEzI37UNc73xXkhTg8LuqsfKX9W7LjiQY3yRvViVn7ZhuJWLTV4136vsLJf2sXiZKmdykbw==", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "nodemailer": "^6.3.0" + } + }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -1425,6 +1441,12 @@ "tar": "^4.4.2" } }, + "nodemailer": { + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.4.11.tgz", + "integrity": "sha512-BVZBDi+aJV4O38rxsUh164Dk1NCqgh6Cm0rQSb9SK/DHGll/DrCMnycVDD7msJgZCnmVa8ASo8EZzR7jsgTukQ==", + "dev": true + }, "nodemon": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", diff --git a/package.json b/package.json index 489b334..ccdd166 100644 --- a/package.json +++ b/package.json @@ -1,30 +1,33 @@ { - "name": "censo2020back", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "test:db": "node server/config/test", - "install:db": "node server/models/install" - }, - "author": "", - "license": "ISC", - "dependencies": { - "bcrypt": "^5.0.0", - "colors": "^1.4.0", - "cors": "^2.8.5", - "dotenv": "^8.2.0", - "express": "^4.17.1", - "jsonwebtoken": "^8.5.1", - "log-symbols": "^4.0.0", - "mariadb": "^2.4.2", - "moment": "^2.27.0", - "mysql2": "^2.1.0", - "node-localstorage": "^2.1.6", - "sequelize": "^6.3.4" - }, - "devDependencies": { - "nodemon": "^2.0.4" - } + "name": "censo2020back", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "test:db": "node server/config/test", + "install:db": "node server/models/install", + "sendemail": "node helpers/sendEmail" + }, + "author": "", + "license": "ISC", + "dependencies": { + "bcrypt": "^5.0.0", + "colors": "^1.4.0", + "cors": "^2.8.5", + "dotenv": "^8.2.0", + "express": "^4.17.1", + "jsonwebtoken": "^8.5.1", + "log-symbols": "^4.0.0", + "mariadb": "^2.4.2", + "moment": "^2.27.0", + "mysql2": "^2.1.0", + "node-localstorage": "^2.1.6", + "sequelize": "^6.3.4" + }, + "devDependencies": { + "generate-password": "^1.5.1", + "gmail-send": "^1.8.10", + "nodemon": "^2.0.4" + } } diff --git a/scratch/token b/scratch/token index fefe1be..c3060ef 100644 --- a/scratch/token +++ b/scratch/token @@ -1 +1 @@ -eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkQWRtaW4iOjIsIm5hbWUiOiJhbGZyZWRvamwiLCJwYXNzd29yZCI6IiQyYiQxMCRtTUlnR0NUUGlhU01ObnhmcnQ1bG5lV29xTlhQZVV5aGVFVEw4RFBOMU1nRENIT3lLeEsvRyIsImlzQWRtaW4iOmZhbHNlLCJjcmVhdGVkQXQiOiIyMDIwLTA4LTE3VDE5OjE3OjQ5LjAwMFoiLCJ1cGRhdGVkQXQiOiIyMDIwLTA4LTE3VDE5OjE3OjQ5LjAwMFoifSwiaWF0IjoxNTk3ODgyNjExLCJleHAiOjE1OTc5NjkwMTF9.J_VzUBKHZ4PWHjd2NVEOqjOgSWhEr2k4QWJyZzQORp4 \ No newline at end of file +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkQWRtaW4iOjEsIm5hbWUiOiJhbGZyZWRvLmxpbWFAYWNhdGxhbi51bmFtLm14IiwicGFzc3dvcmQiOiIkMmIkMTAkVVJYZzUvYXVCeG1McEY4L21CRzRmLklhZTFjd1dKeTZPSUNwYllhY2dNWHN6NVgvRmRQR3kiLCJpc0FkbWluIjpmYWxzZSwiY3JlYXRlZEF0IjoiMjAyMC0wOC0yMVQwMjo0OToyNS4wMDBaIiwidXBkYXRlZEF0IjoiMjAyMC0wOC0yMVQwMjo0OToyNS4wMDBaIn0sImlhdCI6MTU5Nzk3ODM4MSwiZXhwIjoxNTk4MDY0NzgxfQ.U7kSEbe6KwJ-olk-GUMBt4y10VT80D1ICOzyGB8OINs \ No newline at end of file diff --git a/server/controller/login/post.js b/server/controller/login/post.js index 4c4f3e2..b15178b 100644 --- a/server/controller/login/post.js +++ b/server/controller/login/post.js @@ -15,19 +15,19 @@ const post = async(req, res) => { }); if (user == null) { - console.log("not found!"); + console.log("Invalid user or password"); return res.status(500).json({ err: { - message: `No se pudo encontrar «${body.name}»` + message: "Invalid user or password" } }) } if (!bcrypt.compareSync(body.password, user.password)) { - console.log('Wrong password'); + console.log('Invalid user or password'); return res.json({ err: { - message: 'Wrong password' + message: 'Invalid user or password' } }) }