From ef4bfec3f2d9ac6d13d2a6677e7ddfc927868075 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Mon, 7 Oct 2024 13:47:20 +0800 Subject: [PATCH 1/2] Refactor network service, clear auth and monitor state on bad token --- Client/src/Utils/NetworkService.js | 18 +++++++++++++++--- Client/src/Utils/NetworkServiceProvider.jsx | 15 +++++++++++++++ Client/src/main.jsx | 13 ++++++++----- 3 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 Client/src/Utils/NetworkServiceProvider.jsx diff --git a/Client/src/Utils/NetworkService.js b/Client/src/Utils/NetworkService.js index c72fce9d0..460befc0b 100644 --- a/Client/src/Utils/NetworkService.js +++ b/Client/src/Utils/NetworkService.js @@ -1,10 +1,14 @@ import axios from "axios"; const BASE_URL = import.meta.env.VITE_APP_API_BASE_URL; const FALLBACK_BASE_URL = "http://localhost:5000/api/v1"; +import { clearAuthState } from "../Features/Auth/authSlice"; +import { clearUptimeMonitorState } from "../Features/UptimeMonitors/uptimeMonitorsSlice"; import { logger } from "./Logger"; class NetworkService { - constructor(store) { + constructor(store, dispatch, navigate) { this.store = store; + this.dispatch = dispatch; + this.navigate = navigate; let baseURL = BASE_URL; this.axiosInstance = axios.create(); this.setBaseUrl(baseURL); @@ -22,9 +26,10 @@ class NetworkService { this.axiosInstance.interceptors.response.use( (response) => response, (error) => { - logger.error(error); if (error.response && error.response.status === 401) { - logger.error("Invalid token received"); + dispatch(clearAuthState()); + dispatch(clearUptimeMonitorState()); + navigate("/login"); } return Promise.reject(error); } @@ -688,3 +693,10 @@ class NetworkService { } export default NetworkService; + +let networkService; + +export const setNetworkService = (service) => { + networkService = service; +}; +export { networkService }; diff --git a/Client/src/Utils/NetworkServiceProvider.jsx b/Client/src/Utils/NetworkServiceProvider.jsx new file mode 100644 index 000000000..4c66681e0 --- /dev/null +++ b/Client/src/Utils/NetworkServiceProvider.jsx @@ -0,0 +1,15 @@ +import { useDispatch } from "react-redux"; +import { useNavigate } from "react-router"; +import { setNetworkService } from "./NetworkService"; +import NetworkService from "./NetworkService"; +import { store } from "../store"; + +const NetworkServiceProvider = ({ children }) => { + const dispatch = useDispatch(); + const navigate = useNavigate(); + const networkService = new NetworkService(store, dispatch, navigate); + setNetworkService(networkService); + return children; +}; + +export default NetworkServiceProvider; diff --git a/Client/src/main.jsx b/Client/src/main.jsx index d592f9137..4c04a65eb 100644 --- a/Client/src/main.jsx +++ b/Client/src/main.jsx @@ -1,18 +1,21 @@ -import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App.jsx"; import "./index.css"; -import { BrowserRouter as Router, HashRouter } from "react-router-dom"; +import { BrowserRouter as Router } from "react-router-dom"; import { Provider } from "react-redux"; import { persistor, store } from "./store"; import { PersistGate } from "redux-persist/integration/react"; -import NetworkService from "./Utils/NetworkService.js"; -export const networkService = new NetworkService(store); +import NetworkServiceProvider from "./Utils/NetworkServiceProvider.jsx"; +import { networkService } from "./Utils/NetworkService"; +export { networkService }; + ReactDOM.createRoot(document.getElementById("root")).render( - + + + From 4a3636789e8f2a0a226da32ea5cbc8d0b454e95e Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Mon, 7 Oct 2024 13:54:00 +0800 Subject: [PATCH 2/2] Add token expired msg --- Server/middleware/verifyJWT.js | 5 +++++ Server/utils/messages.js | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Server/middleware/verifyJWT.js b/Server/middleware/verifyJWT.js index 8e2e88b6f..fa1fc3afa 100644 --- a/Server/middleware/verifyJWT.js +++ b/Server/middleware/verifyJWT.js @@ -38,6 +38,11 @@ const verifyJWT = (req, res, next) => { const { jwtSecret } = req.settingsService.getSettings(); jwt.verify(parsedToken, jwtSecret, (err, decoded) => { if (err) { + if (err.name === "TokenExpiredError") { + res + .status(401) + .json({ success: false, msg: errorMessages.EXPIRED_AUTH_TOKEN }); + } return res .status(401) .json({ success: false, msg: errorMessages.INVALID_AUTH_TOKEN }); diff --git a/Server/utils/messages.js b/Server/utils/messages.js index c1e4d887b..f9d345c74 100644 --- a/Server/utils/messages.js +++ b/Server/utils/messages.js @@ -12,6 +12,7 @@ const errorMessages = { UNKNOWN_SERVICE: "Unknown service", NO_AUTH_TOKEN: "No auth token provided", INVALID_AUTH_TOKEN: "Invalid auth token", + EXPIRED_AUTH_TOKEN: "Token expired", //Ownership Middleware VERIFY_OWNER_NOT_FOUND: "Document not found", @@ -93,7 +94,8 @@ const successMessages = { //Maintenance Window Controller MAINTENANCE_WINDOW_CREATE: "Maintenance Window created successfully", - MAINTENANCE_WINDOW_GET_BY_USER: "Got Maintenance Windows by User successfully", + MAINTENANCE_WINDOW_GET_BY_USER: + "Got Maintenance Windows by User successfully", //Ping Operations PING_SUCCESS: "Success",