diff --git a/Dockerfile b/Dockerfile
index 7414d37c016e2da30dbfe25822dc880f6cf1c1da..d5a5deb5e81237b4b377c1f9be7cdafb69da0ff8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -20,7 +20,7 @@
 # If you need more help, visit the Dockerfile reference guide at
 # https://docs.docker.com/engine/reference/builder/
 
-FROM node:16.15 AS base_node
+FROM node:20 AS base_node
 FROM python:3.11-slim AS base_python
 # Keeps Python from buffering stdout and stderr to avoid situations where
 # the application crashes without emitting any logs due to buffering.
@@ -109,7 +109,7 @@ FROM base_node AS dev_node
 WORKDIR /app/gui
 
 ENV PATH /app/node_modules/.bin:$PATH
-ENV NODE_OPTIONS "--max_old_space_size=4096"
+ENV NODE_OPTIONS "--max_old_space_size=4096 --openssl-legacy-provider"
 
 # Fetch and cache all (but only) the dependencies
 COPY gui/yarn.lock gui/package.json ./
diff --git a/gui/craco.config.js b/gui/craco.config.js
index edf02375d2ab6c884fdf916fd275cd04cb43fab3..f51738dab3759257e2883ad19637df101c16933f 100644
--- a/gui/craco.config.js
+++ b/gui/craco.config.js
@@ -1,7 +1,19 @@
 const CracoWorkboxPlugin = require('craco-workbox')
 
 module.exports = {
-    plugins: [{
-        plugin: CracoWorkboxPlugin
-    }]
+  plugins: [{
+    plugin: CracoWorkboxPlugin
+  }],
+  webpack: {
+    configure: (webpackConfig, { env, paths }) => {
+      // Add a rule to handle .mjs files
+      webpackConfig.module.rules.push({
+        test: /\.mjs$/,
+        include: /node_modules/,
+        type: 'javascript/auto'
+      })
+
+      return webpackConfig
+    }
+  }
 }
diff --git a/gui/package.json b/gui/package.json
index a40518630d67b01df6d1571326746a3c2622266a..f9333419f5c3bd4f19e24b82fab4ba7b5f7c5174 100644
--- a/gui/package.json
+++ b/gui/package.json
@@ -29,7 +29,7 @@
     "fetch": "^1.1.0",
     "html-to-react": "^1.3.3",
     "jmespath": "^0.16.0",
-    "keycloak-js": "^18.0.1",
+    "keycloak-js": "^25.0.2",
     "lodash": "^4.17.15",
     "material-ui-chip-input": "^1.1.0",
     "material-ui-flat-pagination": "^4.0.0",
@@ -86,8 +86,8 @@
     "yup": "^0.32.11"
   },
   "scripts": {
-    "start": "craco start",
-    "build": "export CI=true && craco build",
+    "start": "craco --openssl-legacy-provider start",
+    "build": "export CI=true && craco --openssl-legacy-provider build",
     "test": "export WAIT_FOR_GUI=None && craco test --testPathIgnorePatterns=.*/conftest.spec.js --watchAll=false --maxWorkers=4",
     "watch-test": "craco test --testPathIgnorePatterns=.*/conftest.spec.js --maxWorkers=4",
     "test-integration": "export READ_MODE=api WRITE_MODE=none && craco test --testPathIgnorePatterns=.*/conftest.spec.js --watchAll=false --runInBand",
diff --git a/gui/yarn.lock b/gui/yarn.lock
index ac921526913a538882bf3000691bfdb3e55a3bcd..d6613a9750a7a552f0dfaa71e5a94faa26e05534 100644
--- a/gui/yarn.lock
+++ b/gui/yarn.lock
@@ -4069,7 +4069,7 @@ base16@^1.0.0:
   resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70"
   integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==
 
-base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1:
+base64-js@^1.0.2, base64-js@^1.3.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
   integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
@@ -10044,10 +10044,10 @@ js-levenshtein@^1.1.6:
   resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
   integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
 
-js-sha256@^0.9.0:
-  version "0.9.0"
-  resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
-  integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==
+js-sha256@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.11.0.tgz#256a921d9292f7fe98905face82e367abaca9576"
+  integrity sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q==
 
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
@@ -10276,6 +10276,11 @@ just-debounce@^1.0.0:
   resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.1.0.tgz#2f81a3ad4121a76bc7cb45dbf704c0d76a8e5ddf"
   integrity sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==
 
+jwt-decode@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-4.0.0.tgz#2270352425fd413785b2faf11f6e755c5151bd4b"
+  integrity sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==
+
 katex@^0.13.0:
   version "0.13.24"
   resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905"
@@ -10283,13 +10288,13 @@ katex@^0.13.0:
   dependencies:
     commander "^8.0.0"
 
-keycloak-js@^18.0.1:
-  version "18.0.1"
-  resolved "https://registry.yarnpkg.com/keycloak-js/-/keycloak-js-18.0.1.tgz#0c6dedfa8bbb266bac1b16a14b032d65c6afd2d2"
-  integrity sha512-IRXToYpbIrkyfLeNNJly2OjUCf11ncx2Sdsg257NVDwjOYE923osu47w8pfxEVWpTaS14/Y2QjbTHciuBK0RBQ==
+keycloak-js@^25.0.2:
+  version "25.0.2"
+  resolved "https://registry.yarnpkg.com/keycloak-js/-/keycloak-js-25.0.2.tgz#10de8352ae7bb0d46396e4f083b40b959285791b"
+  integrity sha512-ACLf5O5PqzfDJwGqvLpqM0kflYWmyl3+T7M2C23gztJYccDxdfNP54+B9OkXz2GnDpLUId0ceoA+lbHw9t4Wng==
   dependencies:
-    base64-js "^1.5.1"
-    js-sha256 "^0.9.0"
+    js-sha256 "^0.11.0"
+    jwt-decode "^4.0.0"
 
 keycode@^2.1.7:
   version "2.2.1"