const JWT = require("jsonwebtoken"); const User = require("../models/user"); exports.signAccessToken = (userId) => { return new Promise((resolve, reject) => { const payload = {}; const access_key = process.env.ACCESS_TOKEN_SECRET; const options = { audience: userId, issuer: "NeonFlake", expiresIn: "10d", }; JWT.sign(payload, access_key, options, (err, data) => { if (err) reject({ status: 500, message: err.message }); resolve(data); }); }); }; exports.verifyAccessToken = (req, res, next) => { if (!req?.cookies.jwt) return res .status(401) .json({ status: 401, message: "Access Token is required" }); const token = req.cookies.jwt; JWT.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, payload) => { if (err) { if (err.name === "JsonWebTokenError") throw next({ status: 403, message: "Authentication failed" }); else throw next({ status: 401, message: err.message }); } req.userId = payload.aud; User.findById(req.userId) .then((data) => { if (data) { req.data = data; next(); } else { throw next({ status: 401, message: "User not found" }); } }) .catch((err) => { next({ status: 500, message: err.message }); }); }); }; exports.signRefreshToken = (userId) => { return new Promise((resolve, reject) => { const payload = {}; const refresh_key = process.env.REFRESH_TOKEN_SECRET; const options = { audience: userId, issuer: "Apoorv Pandey", expiresIn: "1d", }; JWT.sign(payload, refresh_key, options, (err, result) => { if (err) reject({ status: 500, message: err.message }); resolve(result); }); }); }; exports.verifyRefreshToken = (req, res, next) => { if (!req.cookies.jwt) return next({ status: 401, message: "Error no refresh token provided", }); const token = req.cookies.jwt; JWT.verify(token, process.env.REFRESH_TOKEN_SECRET, (err, payload) => { if (err && err.name !== "TokenExpiredError") return next({ status: 401, message: err.message }); else if (err && err.name === "TokenExpiredError") { const output = JWT.verify(token, process.env.REFRESH_TOKEN_SECRET, { ignoreExpiration: true, }); req.userInfo = { token: output.aud, isExpired: true }; } else { req.userInfo = { token: payload.aud, isExpired: false }; } next(); }); };