diff --git a/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/multiuser.properties b/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/multiuser.properties index 77e62e3625..293b070b6a 100644 --- a/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/multiuser.properties +++ b/assembly/assembly-wsmaster-war/src/main/webapp/WEB-INF/classes/che/multiuser.properties @@ -119,6 +119,9 @@ che.infra.openshift.oauth_identity_provider=NULL # is used che.keycloak.auth_server_url=http://${CHE_HOST}:5050/auth +# Internal network service Url to keycloak identity provider server +che.keycloak.auth_internal_server_url=NULL + # Keycloak realm is used to authenticate users # Can be set to NULL only if `che.keycloak.oidcProvider` # is used diff --git a/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/multiuser/oauth/IdentityProviderConfigFactory.java b/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/multiuser/oauth/IdentityProviderConfigFactory.java index 2d741e4418..560f7d5211 100644 --- a/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/multiuser/oauth/IdentityProviderConfigFactory.java +++ b/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/multiuser/oauth/IdentityProviderConfigFactory.java @@ -84,6 +84,8 @@ public class IdentityProviderConfigFactory extends OpenShiftClientConfigFactory + " \n" + "identity provider by visiting the " + " settings = Maps.newHashMap(); + Map internalSettings = Maps.newHashMap(); settings.put( USERNAME_CLAIM_SETTING, usernameClaim == null ? DEFAULT_USERNAME_CLAIM : usernameClaim); settings.put(CLIENT_ID_SETTING, clientId); settings.put(REALM_SETTING, realm); + + if (serverInternalURL != null) { + internalSettings.put(AUTH_SERVER_URL_INTERNAL_SETTING, serverInternalURL); + } + if (serverURL != null) { settings.put(AUTH_SERVER_URL_SETTING, serverURL); settings.put(PROFILE_ENDPOINT_SETTING, serverURL + "/realms/" + realm + "/account"); @@ -132,14 +157,24 @@ public class KeycloakSettings { if (tokenEndpoint != null) { settings.put(TOKEN_ENDPOINT_SETTING, tokenEndpoint); } + String userInfoEndpoint = (String) openIdConfiguration.get("userinfo_endpoint"); if (userInfoEndpoint != null) { settings.put(USERINFO_ENDPOINT_SETTING, userInfoEndpoint); + if (serverURL != null) { + String internalInfoEndpoint = userInfoEndpoint.replace(serverURL, serverInternalURL); + internalSettings.put(USERINFO_ENDPOINT_SETTING, internalInfoEndpoint); + } } String jwksUriEndpoint = (String) openIdConfiguration.get("jwks_uri"); if (jwksUriEndpoint != null) { settings.put(JWKS_ENDPOINT_SETTING, jwksUriEndpoint); + if (serverURL != null) { + String internalJwksUriEndpoint = jwksUriEndpoint.replace(serverURL, serverInternalURL); + internalSettings.put(JWKS_ENDPOINT_SETTING, internalJwksUriEndpoint); + } } + settings.put(OSO_ENDPOINT_SETTING, osoEndpoint); settings.put(GITHUB_ENDPOINT_SETTING, gitHubEndpoint); @@ -161,9 +196,14 @@ public class KeycloakSettings { settings.put(JS_ADAPTER_URL_SETTING, jsAdapterUrl); this.settings = Collections.unmodifiableMap(settings); + this.internalSettings = Collections.unmodifiableMap(internalSettings); } public Map get() { return settings; } + + public Map getInternalSettings() { + return internalSettings; + } } diff --git a/multiuser/keycloak/che-multiuser-keycloak-server/src/main/java/org/eclipse/che/multiuser/keycloak/server/dao/KeycloakProfileDao.java b/multiuser/keycloak/che-multiuser-keycloak-server/src/main/java/org/eclipse/che/multiuser/keycloak/server/dao/KeycloakProfileDao.java index f859039fde..f4e82e083b 100644 --- a/multiuser/keycloak/che-multiuser-keycloak-server/src/main/java/org/eclipse/che/multiuser/keycloak/server/dao/KeycloakProfileDao.java +++ b/multiuser/keycloak/che-multiuser-keycloak-server/src/main/java/org/eclipse/che/multiuser/keycloak/server/dao/KeycloakProfileDao.java @@ -25,7 +25,7 @@ import org.eclipse.che.commons.env.EnvironmentContext; import org.eclipse.che.multiuser.keycloak.server.KeycloakProfileRetriever; /** - * Fetches user profile from Keycloack server. + * Fetches user profile from Keycloak server. * * @author Max Shaposhnik (mshaposh@redhat.com) * @author Sergii Leshchenko diff --git a/multiuser/keycloak/che-multiuser-keycloak-server/src/test/java/org/eclipse/che/multiuser/keycloak/server/KeycloakServiceClientTest.java b/multiuser/keycloak/che-multiuser-keycloak-server/src/test/java/org/eclipse/che/multiuser/keycloak/server/KeycloakServiceClientTest.java index ae216b5a11..e0b626591f 100644 --- a/multiuser/keycloak/che-multiuser-keycloak-server/src/test/java/org/eclipse/che/multiuser/keycloak/server/KeycloakServiceClientTest.java +++ b/multiuser/keycloak/che-multiuser-keycloak-server/src/test/java/org/eclipse/che/multiuser/keycloak/server/KeycloakServiceClientTest.java @@ -13,7 +13,7 @@ package org.eclipse.che.multiuser.keycloak.server; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static org.eclipse.che.dto.server.DtoFactory.newDto; -import static org.eclipse.che.multiuser.keycloak.shared.KeycloakConstants.AUTH_SERVER_URL_SETTING; +import static org.eclipse.che.multiuser.keycloak.shared.KeycloakConstants.AUTH_SERVER_URL_INTERNAL_SETTING; import static org.eclipse.che.multiuser.keycloak.shared.KeycloakConstants.REALM_SETTING; import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; @@ -67,10 +67,12 @@ public class KeycloakServiceClientTest { public void setUp() throws Exception { keycloakServiceClient = new KeycloakServiceClient(keycloakSettings, jwtParser); Map conf = new HashMap<>(); - conf.put( - AUTH_SERVER_URL_SETTING, + Map confInternal = new HashMap<>(); + confInternal.put( + AUTH_SERVER_URL_INTERNAL_SETTING, RestAssured.baseURI + ":" + RestAssured.port + RestAssured.basePath); conf.put(REALM_SETTING, "che"); + when(keycloakSettings.getInternalSettings()).thenReturn(confInternal); when(keycloakSettings.get()).thenReturn(conf); } diff --git a/multiuser/keycloak/che-multiuser-keycloak-shared/src/main/java/org/eclipse/che/multiuser/keycloak/shared/KeycloakConstants.java b/multiuser/keycloak/che-multiuser-keycloak-shared/src/main/java/org/eclipse/che/multiuser/keycloak/shared/KeycloakConstants.java index dc9a388d59..0259162b19 100644 --- a/multiuser/keycloak/che-multiuser-keycloak-shared/src/main/java/org/eclipse/che/multiuser/keycloak/shared/KeycloakConstants.java +++ b/multiuser/keycloak/che-multiuser-keycloak-shared/src/main/java/org/eclipse/che/multiuser/keycloak/shared/KeycloakConstants.java @@ -18,6 +18,9 @@ public class KeycloakConstants { private static final String KEYCLOAK_SETTINGS_ENDPOINT_PATH = "/keycloak/settings"; public static final String AUTH_SERVER_URL_SETTING = KEYCLOAK_SETTING_PREFIX + "auth_server_url"; + public static final String AUTH_SERVER_URL_INTERNAL_SETTING = + KEYCLOAK_SETTING_PREFIX + "auth_internal_server_url"; + public static final String REALM_SETTING = KEYCLOAK_SETTING_PREFIX + "realm"; public static final String CLIENT_ID_SETTING = KEYCLOAK_SETTING_PREFIX + "client_id"; public static final String OIDC_PROVIDER_SETTING = KEYCLOAK_SETTING_PREFIX + "oidc_provider"; diff --git a/multiuser/keycloak/che-multiuser-keycloak-user-remover/src/main/java/org/eclipse/che/multiuser/keycloak/server/KeycloakUserRemover.java b/multiuser/keycloak/che-multiuser-keycloak-user-remover/src/main/java/org/eclipse/che/multiuser/keycloak/server/KeycloakUserRemover.java index d39c6f7acd..c34386de52 100644 --- a/multiuser/keycloak/che-multiuser-keycloak-user-remover/src/main/java/org/eclipse/che/multiuser/keycloak/server/KeycloakUserRemover.java +++ b/multiuser/keycloak/che-multiuser-keycloak-user-remover/src/main/java/org/eclipse/che/multiuser/keycloak/server/KeycloakUserRemover.java @@ -13,8 +13,7 @@ package org.eclipse.che.multiuser.keycloak.server; import static java.nio.charset.StandardCharsets.UTF_8; import static javax.ws.rs.HttpMethod.POST; -import static org.eclipse.che.multiuser.keycloak.shared.KeycloakConstants.AUTH_SERVER_URL_SETTING; -import static org.eclipse.che.multiuser.keycloak.shared.KeycloakConstants.REALM_SETTING; +import static org.eclipse.che.multiuser.keycloak.shared.KeycloakConstants.*; import com.google.common.base.Strings; import com.google.gson.JsonElement; @@ -76,9 +75,14 @@ public class KeycloakUserRemover { this.keycloakPassword = keycloakPassword; this.requestFactory = requestFactory; if (userRemovalEnabled) { - String serverUrl = keycloakSettings.get().get(AUTH_SERVER_URL_SETTING); + String serverUrl = + keycloakSettings.getInternalSettings().get(AUTH_SERVER_URL_INTERNAL_SETTING); if (serverUrl == null) { - throw new ConfigurationException(AUTH_SERVER_URL_SETTING + " is not configured"); + throw new ConfigurationException( + AUTH_SERVER_URL_SETTING + + " or " + + AUTH_SERVER_URL_INTERNAL_SETTING + + " is not configured"); } String realm = keycloakSettings.get().get(REALM_SETTING); if (realm == null) {