diff --git a/config/environments/development.js b/config/environments/development.js index 6e500c4..92ab079 100644 --- a/config/environments/development.js +++ b/config/environments/development.js @@ -9,7 +9,7 @@ module.exports = { session: { secret_token: process.env.SECRET_TOKEN || "B57J=7B`NQ$y98|~5;hc715bo09^5oz8NR+]n9r~215B91Nd9P%25_N6r!GHcOKp|18y5-73Dr5^@9k7n]5l<-41D1o", - token_expires_in: '99d' + token_expires_in: '5' }, server: { diff --git a/config/environments/production.js b/config/environments/production.js index 58a665c..4fa5e24 100644 --- a/config/environments/production.js +++ b/config/environments/production.js @@ -9,7 +9,7 @@ module.exports = { session: { secret_token: process.env.SECRET_TOKEN || "B57J=7B`NQ$y98|~5;hc715bo09^5oz8NR+]n9r~215B91Nd9P%25_N6r!GHcOKp|18y5-73Dr5^@9k7n]5l<-41D1o", - token_expires_in: '24h' + token_expires_in: '5' }, server: { diff --git a/helpers/security.helper.js b/helpers/security.helper.js index 51cda5d..09ab737 100644 --- a/helpers/security.helper.js +++ b/helpers/security.helper.js @@ -1,6 +1,7 @@ const fs = require('fs'); const path = require('path'); const jwt = require('jsonwebtoken'); +const randtoken = require('rand-token'); const bCrypt = require('bcrypt'); const config = require('../config'); @@ -53,7 +54,10 @@ const _sign = (payload, options) => { algorithm: "RS256" }; - return jwt.sign(payload, privateKEY, signOptions); + const token = jwt.sign(payload, privateKEY, signOptions); + const refreshToken = randtoken.uid(256); + refreshToken[refreshToken] = payload; + return { token, refreshToken }; } const _verify = (token, options) => { diff --git a/modules/auth/auth.controller.js b/modules/auth/auth.controller.js index 5b13c71..8e4d488 100644 --- a/modules/auth/auth.controller.js +++ b/modules/auth/auth.controller.js @@ -15,12 +15,6 @@ const authService = require('./auth.service'); // Module Name const MODULE_NAME = '[auth.controller]'; -// Error Messages -const NOT_FOUND = 'Videogame not found'; - -// Success Messages -const VG_CT_VIDEOGAME_DELETED_SUCCESSFULLY = 'Videogame deleted successfully'; - //////////////////////////////////////////////////////////////////////////////// // PUBLIC METHODS //////////////////////////////////////////////////////////////////////////////// @@ -32,8 +26,11 @@ async function login(req, res, next) { email: req.user.email }; - res.json({ - token: securityHelper.generateToken(data), + const tokens = securityHelper.generateToken(data); + + res.status(httpStatus.OK).json({ + token: tokens.token, + refreshToken: tokens.refreshToken, user: data, }); } catch (error) { @@ -43,37 +40,67 @@ async function login(req, res, next) { async function register(req, res, next) { try { -console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>regsitro'); + console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>regsitro'); const values = { phone: req.body.phone, platform: req.body.fbuid }; - const token = securityHelper.generateToken(values); + const tokens = securityHelper.generateToken(values); + console.log(tokens) const data = { - token : token, + token: tokens.refreshToken, phone: req.body.phone, fbuid: req.body.fbuid, email: req.body.email, name: req.body.name, surname: req.body.surname, entityid: req.body.entityid, - accessibility: req.body.accessibility + accessibility: req.body.accesssibility }; console.log(data); - res.json({ - user: await authService.extraMethods.createUser(data), - }); - + const newUser = await authService.extraMethods.createUser(data); + const result = { + token: 'JWT ' + tokens.token, + user: newUser, + }; + console.log(result); + return controllerHelper.handleResultResponse(result, null, req.params, res, httpStatus.OK); } catch (error) { - controllerHelper.handleErrorResponse(MODULE_NAME, register.name, error, res) + console.log(error); + controllerHelper.handleErrorResponse(MODULE_NAME, register.name, error, res); + } +} + +async function regenerateToken(req, res, next) { + const refreshToken = req.body.refreshToken; + const phone = req.body.phone; + const user = await authService.extraMethods.findUserByRefreshToken(refreshToken); + + if (user && user.phone === phone) { + const values = { + phone: user.phone, + platform: user.fbuid + }; + + try { + const tokens = securityHelper.generateToken(values); + await authService.extraMethods.updateUserRefreshToken(user.id, tokens.refreshToken); + const result = { token: 'JWT ' + tokens.token }; + return controllerHelper.handleResultResponse(result, null, req.params, res, httpStatus.OK); + } catch(error) { + controllerHelper.handleErrorResponse(MODULE_NAME, regenerateToken.name, error, res); + } + } else { + return controllerHelper.handleResultResponse(null, null, req.params, res, httpStatus.UNAUTHORIZED); } } module.exports = { login, register, + regenerateToken, MODULE_NAME } \ No newline at end of file diff --git a/modules/auth/auth.routes.js b/modules/auth/auth.routes.js index f768a04..0fdad85 100644 --- a/modules/auth/auth.routes.js +++ b/modules/auth/auth.routes.js @@ -29,4 +29,8 @@ routes.get('/pepepe', AccessValidator.isLoggedUser, } ); +routes.post('/token', + authController.regenerateToken, +); + module.exports = routes; \ No newline at end of file diff --git a/modules/auth/auth.service.js b/modules/auth/auth.service.js index d5e3d2b..909626c 100644 --- a/modules/auth/auth.service.js +++ b/modules/auth/auth.service.js @@ -17,6 +17,24 @@ const extraMethods = { return result; // }); }, + + findUserByRefreshToken: async(refreshToken) => { + return await models.User.findOne({ + where: { + token: refreshToken, + state: 'active' + } + }) + }, + + updateUserRefreshToken: async(userId, newRefreshToken) => { + return await models.User.update( + { token: newRefreshToken }, + { where: { id: userId }} + ); + } + + } module.exports = { diff --git a/modules/auth/user.model.js b/modules/auth/user.model.js index 6051aa0..899e356 100644 --- a/modules/auth/user.model.js +++ b/modules/auth/user.model.js @@ -42,11 +42,11 @@ module.exports = function (sequelize, DataTypes) { defaultValue: true, }, token: { - type: DataTypes.STRING, + type: DataTypes.STRING(512), }, state: { type: DataTypes.STRING, - defaultValue: 'borrador', + defaultValue: 'active', }, lastlogin: { type: DataTypes.DATE, diff --git a/package.json b/package.json index 580a078..22bc178 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "passport-local": "^1.0.0", "path": "^0.12.7", "pino": "^4.7.1", + "rand-token": "^0.4.0", "response-time": "^2.3.2", "sequelize": "^5.3.5", "vm": "^0.1.0",