Require Keycloak JS configuration to be passed explicitly (#33399)

Closes #32823

Signed-off-by: Jon Koops <jonkoops@gmail.com>
This commit is contained in:
Jon Koops 2024-10-01 10:29:10 +02:00 committed by GitHub
parent e582a17a7c
commit 67b6b4c942
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 30 additions and 25 deletions

View file

@ -28,7 +28,7 @@ export interface KeycloakConfig {
/** /**
* URL to the Keycloak server, for example: http://keycloak-server/auth * URL to the Keycloak server, for example: http://keycloak-server/auth
*/ */
url?: string; url: string;
/** /**
* Name of the realm, for example: 'myrealm' * Name of the realm, for example: 'myrealm'
*/ */
@ -373,7 +373,7 @@ declare class Keycloak {
* Creates a new Keycloak client instance. * Creates a new Keycloak client instance.
* @param config A configuration object or path to a JSON config file. * @param config A configuration object or path to a JSON config file.
*/ */
constructor(config?: KeycloakConfig | string) constructor(config: KeycloakConfig | string)
/** /**
* Is true if the user is authenticated, false otherwise. * Is true if the user is authenticated, false otherwise.

View file

@ -19,6 +19,22 @@ function Keycloak (config) {
throw new Error("The 'Keycloak' constructor must be invoked with 'new'.") throw new Error("The 'Keycloak' constructor must be invoked with 'new'.")
} }
if (typeof config !== 'string' && !isObject(config)) {
throw new Error("The 'Keycloak' constructor must be provided with a configuration object, or a URL to a JSON configuration file.");
}
if (isObject(config)) {
const requiredProperties = 'oidcProvider' in config
? ['clientId']
: ['url', 'realm', 'clientId'];
for (const property of requiredProperties) {
if (!config[property]) {
throw new Error(`The configuration object is missing the required '${property}' property.`);
}
}
}
var kc = this; var kc = this;
var adapter; var adapter;
var refreshQueue = []; var refreshQueue = [];
@ -175,7 +191,7 @@ function Keycloak (config) {
promise.setError(error); promise.setError(error);
}); });
var configPromise = loadConfig(config); var configPromise = loadConfig();
function onLoad() { function onLoad() {
var doLogin = function(prompt) { var doLogin = function(prompt) {
@ -797,13 +813,11 @@ function Keycloak (config) {
} }
function loadConfig(url) { function loadConfig() {
var promise = createPromise(); var promise = createPromise();
var configUrl; var configUrl;
if (!config) { if (typeof config === 'string') {
configUrl = 'keycloak.json';
} else if (typeof config === 'string') {
configUrl = config; configUrl = config;
} }
@ -888,27 +902,10 @@ function Keycloak (config) {
req.send(); req.send();
} else { } else {
if (!config.clientId) {
throw 'clientId missing';
}
kc.clientId = config.clientId; kc.clientId = config.clientId;
var oidcProvider = config['oidcProvider']; var oidcProvider = config['oidcProvider'];
if (!oidcProvider) { if (!oidcProvider) {
if (!config['url']) {
var scripts = document.getElementsByTagName('script');
for (var i = 0; i < scripts.length; i++) {
if (scripts[i].src.match(/.*keycloak\.js/)) {
config.url = scripts[i].src.substr(0, scripts[i].src.indexOf('/js/keycloak.js'));
break;
}
}
}
if (!config.realm) {
throw 'realm missing';
}
kc.authServerUrl = config.url; kc.authServerUrl = config.url;
kc.realm = config.realm; kc.realm = config.realm;
setupOidcEndoints(null); setupOidcEndoints(null);
@ -1815,3 +1812,11 @@ function b64DecodeUnicode(input) {
return "%" + code; return "%" + code;
})); }));
} }
/**
* Check if the input is an object that can be operated on.
* @param {unknown} input
*/
function isObject(input) {
return typeof input === 'object' && input !== null;
}

View file

@ -171,7 +171,7 @@ public class JavascriptTestExecutor {
jsExecutor.executeScript("console.warn = event;"); jsExecutor.executeScript("console.warn = event;");
if (argumentsBuilder == null) { if (argumentsBuilder == null) {
jsExecutor.executeScript("window.keycloak = new Keycloak();"); jsExecutor.executeScript("window.keycloak = new Keycloak('./keycloak.json');");
} else { } else {
String configArguments = argumentsBuilder.build(); String configArguments = argumentsBuilder.build();
jsExecutor.executeScript("window.keycloak = new Keycloak(" + configArguments + ");"); jsExecutor.executeScript("window.keycloak = new Keycloak(" + configArguments + ");");