index.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import jwt from "jsonwebtoken";
  2. import redis from "../../../config/redis";
  3. import {
  4. User
  5. } from "../../../models/User";
  6. import {
  7. RefreshTokenResult
  8. } from "./types";
  9. const refreshToken = async (token: string): Promise<RefreshTokenResult> => {
  10. try {
  11. if (!token) {
  12. return {
  13. message: "refreshToken-required",
  14. code: 400
  15. };
  16. }
  17. const user = await User.findOne({
  18. refreshToken: token
  19. });
  20. if (!user) {
  21. return {
  22. message: "user-not-found",
  23. code: 404
  24. };
  25. }
  26. const userID = user._id.toString();
  27. let decoded: {
  28. companyName: string;
  29. fullName: string;
  30. userID: string;
  31. };
  32. try {
  33. decoded = jwt.verify(
  34. token,
  35. process.env.JWT_SECRET as string
  36. ) as typeof decoded;
  37. } catch {
  38. return {
  39. message: "invalid-refresh-token",
  40. code: 401
  41. };
  42. }
  43. const newAccessToken = jwt.sign(
  44. {
  45. companyName: user.companyName,
  46. fullName: user.fullName,
  47. userID: user._id
  48. },
  49. process.env.JWT_SECRET as string,
  50. {
  51. expiresIn: "4h"
  52. }
  53. );
  54. const newRefreshToken = jwt.sign(
  55. {
  56. companyName: user.companyName,
  57. fullName: user.fullName,
  58. userID: user._id
  59. },
  60. process.env.JWT_SECRET as string,
  61. {
  62. expiresIn: "30d"
  63. }
  64. );
  65. await redis.setex(userID, 14400, newAccessToken);
  66. user.refreshToken = newRefreshToken;
  67. await user.save();
  68. return {
  69. code: 200,
  70. message: "token-refreshed",
  71. payload: {
  72. refreshToken: newRefreshToken,
  73. accessToken: newAccessToken,
  74. },
  75. };
  76. } catch (error) {
  77. console.error("RefreshToken action error:", error);
  78. return {
  79. message: "internal-server-error",
  80. code: 500
  81. };
  82. }
  83. };
  84. export default refreshToken;