diff --git a/packages/auth/package.json b/packages/auth/package.json
index f2c0f5317574d15654d23edb518dd0875fde76da..4c3f9dabea8ed77c58649ce431218bd9876b1b6f 100644
--- a/packages/auth/package.json
+++ b/packages/auth/package.json
@@ -42,6 +42,7 @@
         "@dbp-toolkit/common": "^0.3.3",
         "@open-wc/scoped-elements": "^2.1.0",
         "event-target-shim": "^6.0.0",
+        "keycloak-js": "^20.0.1",
         "lit": "^2.0.0"
     },
     "scripts": {
diff --git a/packages/auth/src/keycloak.js b/packages/auth/src/keycloak.js
index 50b25d8f65f356bf6152bdd2141f022c016cd43e..81f9fbfb0b342d94e05401d886b083af99877ef8 100644
--- a/packages/auth/src/keycloak.js
+++ b/packages/auth/src/keycloak.js
@@ -1,20 +1,5 @@
 import {EventTarget} from 'event-target-shim'; // Because EventTarget() doesn't exist on Safari
 
-/**
- * Imports the keycloak JS API as if it was a module.
- *
- * @param baseUrl {string}
- */
-async function importKeycloak(baseUrl) {
-    const keycloakSrc = baseUrl + '/js/keycloak.min.js';
-    // Importing will write it to window so we take it from there
-    await import(keycloakSrc);
-    if (importKeycloak._keycloakMod !== undefined) return importKeycloak._keycloakMod;
-    importKeycloak._keycloakMod = window.Keycloak;
-    delete window.Keycloak;
-    return importKeycloak._keycloakMod;
-}
-
 const promiseTimeout = function (ms, promise) {
     let timeout = new Promise((resolve, reject) => {
         let id = setTimeout(() => {
@@ -157,9 +142,9 @@ export class KeycloakWrapper extends EventTarget {
     async _ensureInstance() {
         if (this._keycloak !== null) return;
 
-        const Keycloak = await importKeycloak(this._baseURL);
+        const Keycloak = (await import('keycloak-js')).default;
 
-        this._keycloak = Keycloak({
+        this._keycloak = new Keycloak({
             url: this._baseURL,
             realm: this._realm,
             clientId: this._clientId,
diff --git a/yarn.lock b/yarn.lock
index a148b1f434dcf5bb965ebb43c5e5174f344893cd..44096d11ed3cdc035709130cca59c12e74b6b15f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2663,7 +2663,7 @@ base-64@^1.0.0:
   resolved "https://registry.yarnpkg.com/base-64/-/base-64-1.0.0.tgz#09d0f2084e32a3fd08c2475b973788eee6ae8f4a"
   integrity sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==
 
-base64-js@^1.3.1:
+base64-js@^1.3.1, base64-js@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
   integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
@@ -5418,6 +5418,11 @@ js-sdsl@^4.1.4:
   resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a"
   integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==
 
+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-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -5593,6 +5598,14 @@ karma@^6.0.0:
     ua-parser-js "^0.7.30"
     yargs "^16.1.1"
 
+keycloak-js@^20.0.1:
+  version "20.0.1"
+  resolved "https://registry.yarnpkg.com/keycloak-js/-/keycloak-js-20.0.1.tgz#3f73499a6b071d096f82ab74257b1b7429f53c8c"
+  integrity sha512-YNj0X0mmdLpqjB9W5DTAVDI14CzZs7RFn9T/t/g8Uq80OjaW2zZUis/g73aWwz04S3B6U6Vrg8h1wAMGbx2NQQ==
+  dependencies:
+    base64-js "^1.5.1"
+    js-sha256 "^0.9.0"
+
 kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"