From a665859e11d8e4cfea31f52c42872b7b69969a55 Mon Sep 17 00:00:00 2001 From: geeknk Date: Mon, 27 Nov 2023 19:11:19 +0530 Subject: [PATCH] resolve foreign key error and added refresh token --- config/constant.js | 5 +-- controllers/userController.js | 11 +++++- migrations/20231125074458-create-address.js | 2 +- models/user.js | 14 ++++++-- package-lock.json | 37 +++++++++++++++++++++ package.json | 1 + services/userservices.js | 29 ++++++++-------- 7 files changed, 77 insertions(+), 22 deletions(-) diff --git a/config/constant.js b/config/constant.js index 03f6ab5..99798d7 100644 --- a/config/constant.js +++ b/config/constant.js @@ -1,9 +1,10 @@ require("dotenv").config(); exports.port = process.env.PORT_NO -exports.secretKey = process.env.SECRET_KEY +exports.ACCESS_TOKEN_SECRET = process.env.ACCESS_TOKEN_SECRET +exports.REFRESH_TOKEN_SECRET = process.env.REFRESH_TOKEN_SECRET exports.db_url = process.env.DB_URL -exports.JWT_EXPIRES_IN = process.env.JWT_EXPIRY +exports.ACCESS_TOKEN_EXPIRES = process.env.JWT_EXPIRY exports.FPASS_EXPIRESIN = process.env.FPASS_EXPIRY exports.API_KEY = process.env.APIKEY exports.EMAIL_FROM = process.env.emailFrom diff --git a/controllers/userController.js b/controllers/userController.js index 65deff4..f5bef48 100644 --- a/controllers/userController.js +++ b/controllers/userController.js @@ -1,3 +1,7 @@ +const cookieparser = require('cookie-parser'); +const express = require("express"); +const app = express(); +app.use(cookieparser()) const userServices = require("../services/userservices") exports.signup = async (req, res) => { @@ -12,7 +16,12 @@ exports.signin = async (req, res) => { if (!loggedin) { return res.status(401).send({ success: false, msg: "Email or Password is wrong" }); } else { - res.status(200).send(loggedin); + // Assigning refresh token in http-only cookie + res.cookie('jwt', loggedin.refreshToken, { httpOnly: true, + sameSite: 'None', secure: true, + maxAge: 24 * 60 * 60 * 1000 + }); + res.status(200).send(loggedin.accessToken); } }; diff --git a/migrations/20231125074458-create-address.js b/migrations/20231125074458-create-address.js index 9038cea..ee5e484 100644 --- a/migrations/20231125074458-create-address.js +++ b/migrations/20231125074458-create-address.js @@ -12,7 +12,7 @@ module.exports = { user_id: { type: Sequelize.INTEGER, references:{ - model:"User", + model:"Users", key:"id", as:"id" } diff --git a/models/user.js b/models/user.js index d1c97b4..424bf80 100644 --- a/models/user.js +++ b/models/user.js @@ -1,5 +1,6 @@ 'use strict'; const {Model} = require('sequelize'); +const bcrypt = require('bcryptjs') module.exports = (sequelize, DataTypes) => { class User extends Model { /** @@ -8,8 +9,8 @@ module.exports = (sequelize, DataTypes) => { * The `models/index` file will call this method automatically. */ static associate(models) { - User.hasMany(models.address,{ - foreignKey:'user_id' + User.hasMany(models.address, { + foreignKey:"user_id" }); User.hasOne(models.userToken); } @@ -25,5 +26,14 @@ module.exports = (sequelize, DataTypes) => { sequelize, modelName: 'User', }); + User.beforeCreate(async function(user){ + try { + const salt = 10; + const hashedpassword = await bcrypt.hash(user.password, salt); + user.password = hashedpassword + } catch (error) { + console.log(error) + } + }); return User; }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ea120d1..b9dc9d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "axios": "^1.6.2", "bcryptjs": "^2.4.3", "cheerio": "^1.0.0-rc.12", + "cookie-parser": "^1.4.6", "dotenv": "^16.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.2", @@ -522,6 +523,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -3165,6 +3186,22 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + } + } + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", diff --git a/package.json b/package.json index 99cabce..f720b53 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "axios": "^1.6.2", "bcryptjs": "^2.4.3", "cheerio": "^1.0.0-rc.12", + "cookie-parser": "^1.4.6", "dotenv": "^16.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.2", diff --git a/services/userservices.js b/services/userservices.js index f237164..67bc2e0 100644 --- a/services/userservices.js +++ b/services/userservices.js @@ -8,7 +8,6 @@ const nodemailer = require("nodemailer") const axios = require("axios"); const Cheerio =require("cheerio"); - const transporter = nodemailer.createTransport({ host:'smtp.gmail.com', port:587, @@ -20,16 +19,9 @@ const transporter = nodemailer.createTransport({ } }); -const getdata = async (ids) => { +const getdata = async (id) => { try { - return await User.findOne({ - include: [ - { - model:address - }, - ], - raw: true, - },{where:{id:ids}}); + return await User.findOne({include: address},{where:{id:id}}); } catch (error) { console.error("Error retrieving data:", error); throw error; @@ -62,7 +54,7 @@ const verifyemail = async (data) =>{ if(emailexist){ const token = jwt.sign( { email: emailexist.email, id: emailexist._id }, - config.secretKey, + config.ACCESS_TOKEN_SECRET, {expiresIn:config.FPASS_EXPIRESIN} ); @@ -100,17 +92,22 @@ const userlogin = async(data) =>{ const pass = bcrypt.compare(userData.password , data.password) if(pass && userData){ - const token = jwt.sign( + const accessToken = jwt.sign( { email: userData.email, id: userData.id }, - config.secretKey, - {expiresIn:config.JWT_EXPIRES_IN} + config.ACCESS_TOKEN_SECRET, + {expiresIn:config.ACCESS_TOKEN_EXPIRES} ); + const refreshToken = jwt.sign({ + username: userData.email, id:userData.id, + }, config.REFRESH_TOKEN_SECRET, + { expiresIn: '1d' }); + await userToken.create({ user_id:userData.id, - token: token, + token: accessToken, expiry: config.JWT_EXPIRES_IN }); - return token; + return {accessToken,refreshToken}; }else{ return false }