You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

89 lines
2.4 KiB

  1. const JWT = require("jsonwebtoken");
  2. const User = require("../models/user");
  3. exports.signAccessToken = (userId) => {
  4. return new Promise((resolve, reject) => {
  5. const payload = {};
  6. const access_key = process.env.ACCESS_TOKEN_SECRET;
  7. const options = {
  8. audience: userId,
  9. issuer: "NeonFlake",
  10. expiresIn: "10d",
  11. };
  12. JWT.sign(payload, access_key, options, (err, data) => {
  13. if (err) reject({ status: 500, message: err.message });
  14. resolve(data);
  15. });
  16. });
  17. };
  18. exports.verifyAccessToken = (req, res, next) => {
  19. if (!req?.cookies.jwt)
  20. return res
  21. .status(401)
  22. .json({ status: 401, message: "Access Token is required" });
  23. const token = req.cookies.jwt;
  24. JWT.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, payload) => {
  25. if (err) {
  26. if (err.name === "JsonWebTokenError")
  27. throw next({ status: 403, message: "Authentication failed" });
  28. else throw next({ status: 401, message: err.message });
  29. }
  30. req.userId = payload.aud;
  31. User.findById(req.userId)
  32. .then((data) => {
  33. if (data) {
  34. req.data = data;
  35. next();
  36. } else {
  37. throw next({ status: 401, message: "User not found" });
  38. }
  39. })
  40. .catch((err) => {
  41. next({ status: 500, message: err.message });
  42. });
  43. });
  44. };
  45. exports.signRefreshToken = (userId) => {
  46. return new Promise((resolve, reject) => {
  47. const payload = {};
  48. const refresh_key = process.env.REFRESH_TOKEN_SECRET;
  49. const options = {
  50. audience: userId,
  51. issuer: "Apoorv Pandey",
  52. expiresIn: "1d",
  53. };
  54. JWT.sign(payload, refresh_key, options, (err, result) => {
  55. if (err) reject({ status: 500, message: err.message });
  56. resolve(result);
  57. });
  58. });
  59. };
  60. exports.verifyRefreshToken = (req, res, next) => {
  61. if (!req.cookies.jwt)
  62. return next({
  63. status: 401,
  64. message: "Error no refresh token provided",
  65. });
  66. const token = req.cookies.jwt;
  67. JWT.verify(token, process.env.REFRESH_TOKEN_SECRET, (err, payload) => {
  68. if (err && err.name !== "TokenExpiredError")
  69. return next({ status: 401, message: err.message });
  70. else if (err && err.name === "TokenExpiredError") {
  71. const output = JWT.verify(token, process.env.REFRESH_TOKEN_SECRET, {
  72. ignoreExpiration: true,
  73. });
  74. req.userInfo = { token: output.aud, isExpired: true };
  75. } else {
  76. req.userInfo = { token: payload.aud, isExpired: false };
  77. }
  78. next();
  79. });
  80. };