From 4456a825153160edf6ee773fefd7f8323287cde7 Mon Sep 17 00:00:00 2001 From: zivglik Date: Sun, 2 Feb 2025 11:01:13 +0200 Subject: [PATCH] logout , updatetoken --- server/server.js | 2 + server/setupConfig.js | 2 + .../Base/Header/Settings/Settings.react.js | 9 +- src/actions/connection.action.js | 2 + src/index.js | 10 ++ src/middleware/rest.middleware.js | 145 +++++++++--------- src/reducers/connection.reducer.js | 2 + src/setupProxy.js | 1 + 8 files changed, 102 insertions(+), 71 deletions(-) diff --git a/server/server.js b/server/server.js index 263d520b2..8b53c154f 100644 --- a/server/server.js +++ b/server/server.js @@ -13,6 +13,7 @@ const { grafanaUrl, grafanaDashboardUrl, dataSourceIsEnable, + keycloakEnable, indexHtml, baseUrl, } = require('./setupConfig'); @@ -35,6 +36,7 @@ app.get('*/dashboard-config.json', (req, res) => { grafanaUrl, grafanaDashboardUrl, dataSourceIsEnable, + keycloakEnable, baseUrl, monitorBackend, board, diff --git a/server/setupConfig.js b/server/setupConfig.js index 232c3df81..3194d2411 100644 --- a/server/setupConfig.js +++ b/server/setupConfig.js @@ -17,6 +17,7 @@ const grafanaUrl = process.env.GRAFANA_URL; const grafanaDashboardUrl = process.env.GRAFANA_URL; const dataSourceIsEnable = process.env.DATA_SOURCE_IS_ENABLE === 'true'; +const keycloakEnable = process.env.KEYCLOAK_ENABLE === 'true'; const baseUrl = process.env.HKUBE_BASE_URL ? process.env.HKUBE_BASE_URL.replace(/^\//, '') @@ -54,6 +55,7 @@ module.exports = { grafanaUrl, grafanaDashboardUrl, dataSourceIsEnable, + keycloakEnable, baseUrl, board, BOARD_HOST, diff --git a/src/Routes/Base/Header/Settings/Settings.react.js b/src/Routes/Base/Header/Settings/Settings.react.js index 70666c784..55b788dd9 100644 --- a/src/Routes/Base/Header/Settings/Settings.react.js +++ b/src/Routes/Base/Header/Settings/Settings.react.js @@ -1,4 +1,5 @@ import React, { useCallback } from 'react'; +import KeycloakServices from 'keycloak/keycloakServices'; import { FlexBox, Icons } from 'components/common'; import { useNavigate } from 'react-router-dom'; import { @@ -36,6 +37,7 @@ const Settings = () => { const { triggerUserGuide } = useActions(); const { hkubeSystemVersion } = useSelector(selectors.connection); const { grafanaUrl } = useSelector(selectors.connection); + const { keycloakEnable } = useSelector(selectors.connection); const onGuideClick = useCallback(() => { triggerUserGuide(); @@ -44,6 +46,8 @@ const Settings = () => { const openUrl = url => () => window.open(url); + const logout = () => KeycloakServices.doLogout(); + const DarkText = styled.div` cursor: pointer; font-size: 14px; @@ -143,7 +147,10 @@ const Settings = () => { type={} onClick={onGuideClick} /> - Help + + Help {keycloakEnable.toString()} + + {keycloakEnable && logout}* {hkubeSystemVersion} diff --git a/src/actions/connection.action.js b/src/actions/connection.action.js index 3b0e4bf90..9873a7868 100644 --- a/src/actions/connection.action.js +++ b/src/actions/connection.action.js @@ -29,6 +29,7 @@ export const connectionSetup = ({ grafanaUrl, grafanaDashboardUrl, dataSourceIsEnable, + keycloakEnable, }) => ({ type: actions.CONNECTION_SETUP, payload: { @@ -41,6 +42,7 @@ export const connectionSetup = ({ grafanaUrl, grafanaDashboardUrl, dataSourceIsEnable, + keycloakEnable, }, }); diff --git a/src/index.js b/src/index.js index 0d21f6aca..ba0600ea3 100644 --- a/src/index.js +++ b/src/index.js @@ -23,6 +23,16 @@ const ConfigProviderApp = () => { const dispatch = useDispatch(); useEffect(() => { dispatch(init()); + + // Start a periodic token refresh + const tokenRefreshInterval = setInterval(() => { + KeycloakServices.updateToken(30, () => { + console.log('Token refreshed successfully!'); + }); + }, 60000); + + // Cleanup on unmount + return () => clearInterval(tokenRefreshInterval); }, [dispatch]); const { hasConfig } = useSelector(selectors.config); diff --git a/src/middleware/rest.middleware.js b/src/middleware/rest.middleware.js index b5e01f927..ba9f1df6b 100644 --- a/src/middleware/rest.middleware.js +++ b/src/middleware/rest.middleware.js @@ -83,82 +83,87 @@ let SOCKET_URL = null; let SOCKET_DATASOURCES_URL = null; let BOARD_URL = null; -const restMiddleware = ({ dispatch }) => next => action => { - if (action.type === `${AT.SOCKET_GET_CONFIG}_SUCCESS`) { - const { - monitorBackend, - board, - hkubeSystemVersion, - kibanaUrl, - structuredPrefix, - grafanaUrl, - grafanaDashboardUrl, - dataSourceIsEnable, - } = action.payload.config; - SOCKET_URL = setMonitorPath(monitorBackend); - SOCKET_DATASOURCES_URL = setDatasourcesPath(monitorBackend); - BOARD_URL = setBoardPath(board); - dispatch( - actions.connectionSetup({ - socketUrl: SOCKET_URL, - socketDatasourcesUrl: SOCKET_DATASOURCES_URL, - boardUrl: BOARD_URL, +const restMiddleware = + ({ dispatch }) => + next => + action => { + if (action.type === `${AT.SOCKET_GET_CONFIG}_SUCCESS`) { + const { + monitorBackend, + board, hkubeSystemVersion, kibanaUrl, structuredPrefix, grafanaUrl, grafanaDashboardUrl, dataSourceIsEnable, - }) - ); - client.defaults.baseURL = SOCKET_URL; + keycloakEnable, + } = action.payload.config; + SOCKET_URL = setMonitorPath(monitorBackend); + SOCKET_DATASOURCES_URL = setDatasourcesPath(monitorBackend); + BOARD_URL = setBoardPath(board); + dispatch( + actions.connectionSetup({ + socketUrl: SOCKET_URL, + socketDatasourcesUrl: SOCKET_DATASOURCES_URL, + boardUrl: BOARD_URL, + hkubeSystemVersion, + kibanaUrl, + structuredPrefix, + grafanaUrl, + grafanaDashboardUrl, + dataSourceIsEnable, + keycloakEnable, + }) + ); + client.defaults.baseURL = SOCKET_URL; + return next(action); + } + if ( + ![ + AT.REST_REQ_GET, + AT.REST_REQ_POST, + AT.REST_REQ_POST_FORM, + AT.REST_REQ_PUT, + AT.REST_REQ_DELETE, + ].includes(action.type) + ) { + return next(action); + } + + if (!SOCKET_URL) return next(action); + pending(dispatch, 'pending', action); + if (action.type === AT.REST_REQ_GET) { + client + .get(action.payload.url) + .then(res => success(dispatch, res.data, action)) + .catch(err => { + const response = + err.response && err.response.data && err.response.data.error; + reject(dispatch, response, action); + }); + } else if (action.type === AT.REST_REQ_POST) { + client + .post(action.payload.url, action.payload.body) + .then(res => success(dispatch, res.data, action)) + .catch(err => reject(dispatch, err.response.data.error, action)); + } else if (action.type === AT.REST_REQ_POST_FORM) { + client + .post(action.payload.url, action.payload.formData) + .then(res => success(dispatch, res.data, action)) + .catch(err => reject(dispatch, err.response.data.error, action)); + } else if (action.type === AT.REST_REQ_PUT) { + client + .put(action.payload.url, action.payload.body) + .then(res => success(dispatch, res.data, action)) + .catch(err => reject(dispatch, err.response.data.error, action)); + } else if (action.type === AT.REST_REQ_DELETE) { + client + .delete(action.payload.url, { data: action.payload.body }) + .then(res => success(dispatch, res.data, action)) + .catch(err => reject(dispatch, err?.response?.data?.error, action)); + } return next(action); - } - if ( - ![ - AT.REST_REQ_GET, - AT.REST_REQ_POST, - AT.REST_REQ_POST_FORM, - AT.REST_REQ_PUT, - AT.REST_REQ_DELETE, - ].includes(action.type) - ) { - return next(action); - } - - if (!SOCKET_URL) return next(action); - pending(dispatch, 'pending', action); - if (action.type === AT.REST_REQ_GET) { - client - .get(action.payload.url) - .then(res => success(dispatch, res.data, action)) - .catch(err => { - const response = - err.response && err.response.data && err.response.data.error; - reject(dispatch, response, action); - }); - } else if (action.type === AT.REST_REQ_POST) { - client - .post(action.payload.url, action.payload.body) - .then(res => success(dispatch, res.data, action)) - .catch(err => reject(dispatch, err.response.data.error, action)); - } else if (action.type === AT.REST_REQ_POST_FORM) { - client - .post(action.payload.url, action.payload.formData) - .then(res => success(dispatch, res.data, action)) - .catch(err => reject(dispatch, err.response.data.error, action)); - } else if (action.type === AT.REST_REQ_PUT) { - client - .put(action.payload.url, action.payload.body) - .then(res => success(dispatch, res.data, action)) - .catch(err => reject(dispatch, err.response.data.error, action)); - } else if (action.type === AT.REST_REQ_DELETE) { - client - .delete(action.payload.url, { data: action.payload.body }) - .then(res => success(dispatch, res.data, action)) - .catch(err => reject(dispatch, err?.response?.data?.error, action)); - } - return next(action); -}; + }; export default restMiddleware; diff --git a/src/reducers/connection.reducer.js b/src/reducers/connection.reducer.js index 475b44852..8ad6a1080 100644 --- a/src/reducers/connection.reducer.js +++ b/src/reducers/connection.reducer.js @@ -17,6 +17,7 @@ const initialState = { grafanaUrl: null, grafanaDashboardUrl: null, dataSourceIsEnable: null, + keycloakEnable: null, hasData: false, isSocketConnected: false, }; @@ -38,6 +39,7 @@ const connection = createSlice({ * grafanaUrl?: string; * grafanaDashboardUrl: string; * dataSourceIsEnable?: boolean; + * keycloakEnable?: boolean; * }; * }} action */ diff --git a/src/setupProxy.js b/src/setupProxy.js index 3ef105466..34fcfd812 100644 --- a/src/setupProxy.js +++ b/src/setupProxy.js @@ -11,6 +11,7 @@ module.exports = app => { grafanaUrl: process.env.GRAFANA_URL, grafanaDashboardUrl: process.env.GRAFANA_URL, dataSourceIsEnable: process.env.DATA_SOURCE_IS_ENABLE === 'true', + keycloakEnable: process.env.KEYCLOAK_ENABLE === 'true', baseUrl: packageJSON.homepage, monitorBackend: { host: process.env.API_SERVER_BACKEND_HOST || 'localhost',