diff --git a/core/src/main/java/org/keycloak/AbstractOAuthClient.java b/core/src/main/java/org/keycloak/AbstractOAuthClient.java index 3d16875408..600dab0960 100755 --- a/core/src/main/java/org/keycloak/AbstractOAuthClient.java +++ b/core/src/main/java/org/keycloak/AbstractOAuthClient.java @@ -19,6 +19,7 @@ public class AbstractOAuthClient { protected String authUrl; protected String codeUrl; protected String refreshUrl; + protected boolean relativeUrls; protected String scope; protected String stateCookieName = OAUTH_TOKEN_REQUEST_STATE; protected String stateCookiePath; @@ -100,6 +101,14 @@ public class AbstractOAuthClient { this.publicClient = publicClient; } + public boolean isRelativeUrls() { + return relativeUrls; + } + + public void setRelativeUrls(boolean relativeUrls) { + this.relativeUrls = relativeUrls; + } + protected String stripOauthParametersFromRedirect(String uri) { KeycloakUriBuilder builder = KeycloakUriBuilder.fromUri(uri) .replaceQueryParam(OAuth2Constants.CODE, null) diff --git a/examples/cordova/example-realm.json b/examples/cordova/example-realm.json index 05ad90511a..161a421d5b 100755 --- a/examples/cordova/example-realm.json +++ b/examples/cordova/example-realm.json @@ -52,9 +52,7 @@ "name": "cordova", "enabled": true, "publicClient": true, - "redirectUris": [ - "http://localhost" - ] + "redirectUris": [] } ], "applicationRoleMappings": { diff --git a/examples/cors/angular-product-app/src/main/webapp/js/app.js b/examples/cors/angular-product-app/src/main/webapp/js/app.js index 3e562055db..d0939976c9 100755 --- a/examples/cors/angular-product-app/src/main/webapp/js/app.js +++ b/examples/cors/angular-product-app/src/main/webapp/js/app.js @@ -18,7 +18,7 @@ angular.element(document).ready(function ($http) { console.log('here login'); auth.loggedIn = true; auth.authz = keycloakAuth; - auth.logoutUrl = keycloakAuth.authServerUrl + "/realms/" + keycloakAuth.realm + "/tokens/logout?redirect_uri=http://localhost:8080/angular-product/index.html"; + auth.logoutUrl = keycloakAuth.authServerUrl + "/realms/" + keycloakAuth.realm + "/tokens/logout?redirect_uri=/angular-product/index.html"; module.factory('Auth', function() { return auth; }); diff --git a/examples/cors/angular-product-app/src/main/webapp/keycloak.json b/examples/cors/angular-product-app/src/main/webapp/keycloak.json index 6b94b27755..1246b2ed6d 100755 --- a/examples/cors/angular-product-app/src/main/webapp/keycloak.json +++ b/examples/cors/angular-product-app/src/main/webapp/keycloak.json @@ -1,7 +1,7 @@ { "realm" : "cors", "realm-public-key" : "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB", - "auth-server-url" : "http://localhost-auth:8080/auth", + "auth-server-url" : "/auth", "ssl-not-required" : true, "resource" : "angular-product", "public-client" : true diff --git a/examples/cors/cors-realm.json b/examples/cors/cors-realm.json index 1dd55035a0..5f801cd09f 100755 --- a/examples/cors/cors-realm.json +++ b/examples/cors/cors-realm.json @@ -47,9 +47,9 @@ "name": "angular-product", "enabled": true, "publicClient": true, - "baseUrl": "http://localhost:8080/angular-product/index.html", + "baseUrl": "/angular-product/index.html", "redirectUris": [ - "http://localhost:8080/angular-product/*" + "/angular-product/*" ], "webOrigins": [ "http://localhost:8080" diff --git a/examples/demo-template/admin-access-app/src/main/java/org/keycloak/example/AdminClient.java b/examples/demo-template/admin-access-app/src/main/java/org/keycloak/example/AdminClient.java index 09a3633bcc..763dfeeea0 100755 --- a/examples/demo-template/admin-access-app/src/main/java/org/keycloak/example/AdminClient.java +++ b/examples/demo-template/admin-access-app/src/main/java/org/keycloak/example/AdminClient.java @@ -16,6 +16,7 @@ import org.keycloak.representations.idm.RoleRepresentation; import org.keycloak.util.JsonSerialization; import org.keycloak.util.KeycloakUriBuilder; +import javax.servlet.http.HttpServletRequest; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -43,14 +44,14 @@ public class AdminClient { } } - public static AccessTokenResponse getToken() throws IOException { + public static AccessTokenResponse getToken(HttpServletRequest request) throws IOException { HttpClient client = new HttpClientBuilder() .disableTrustManager().build(); try { - HttpPost post = new HttpPost(KeycloakUriBuilder.fromUri("http://localhost:8080/auth") + HttpPost post = new HttpPost(KeycloakUriBuilder.fromUri(getBaseUrl(request) + "/auth") .path(ServiceUrlConstants.TOKEN_SERVICE_DIRECT_GRANT_PATH).build("demo")); List formparams = new ArrayList (); formparams.add(new BasicNameValuePair("username", "admin")); @@ -94,14 +95,14 @@ public class AdminClient { } } - public static void logout(AccessTokenResponse res) throws IOException { + public static void logout(HttpServletRequest request, AccessTokenResponse res) throws IOException { HttpClient client = new HttpClientBuilder() .disableTrustManager().build(); try { - HttpGet get = new HttpGet(KeycloakUriBuilder.fromUri("http://localhost:8080/auth") + HttpGet get = new HttpGet(KeycloakUriBuilder.fromUri(getBaseUrl(request) + "/auth") .path(ServiceUrlConstants.TOKEN_SERVICE_LOGOUT_PATH) .queryParam("session_state", res.getSessionState()) .build("demo")); @@ -117,12 +118,12 @@ public class AdminClient { } } - public static List getRealmRoles(AccessTokenResponse res) throws Failure { + public static List getRealmRoles(HttpServletRequest request, AccessTokenResponse res) throws Failure { HttpClient client = new HttpClientBuilder() .disableTrustManager().build(); try { - HttpGet get = new HttpGet("http://localhost:8080/auth/admin/realms/demo/roles"); + HttpGet get = new HttpGet(getBaseUrl(request) + "/auth/admin/realms/demo/roles"); get.addHeader("Authorization", "Bearer " + res.getToken()); try { HttpResponse response = client.execute(get); @@ -143,4 +144,10 @@ public class AdminClient { client.getConnectionManager().shutdown(); } } + + public static String getBaseUrl(HttpServletRequest request) { + String url = request.getRequestURL().toString(); + return url.substring(0, url.indexOf('/', 8)); + } + } diff --git a/examples/demo-template/admin-access-app/src/main/webapp/admin/admin.jsp b/examples/demo-template/admin-access-app/src/main/webapp/admin/admin.jsp index 11078882c2..7f478b41e4 100755 --- a/examples/demo-template/admin-access-app/src/main/webapp/admin/admin.jsp +++ b/examples/demo-template/admin-access-app/src/main/webapp/admin/admin.jsp @@ -12,9 +12,9 @@ <% java.util.List list = null; try { - AccessTokenResponse res = AdminClient.getToken(); - list = AdminClient.getRealmRoles(res); - AdminClient.logout(res); + AccessTokenResponse res = AdminClient.getToken(request); + list = AdminClient.getRealmRoles(request, res); + AdminClient.logout(request, res); } catch (AdminClient.Failure failure) { out.println("There was a failure processing request. You either didn't configure Keycloak properly"); out.println("Status from database service invocation was: " + failure.getStatus()); diff --git a/examples/demo-template/angular-product-app/src/main/webapp/js/app.js b/examples/demo-template/angular-product-app/src/main/webapp/js/app.js index 7062c41f7a..05dafbb84c 100755 --- a/examples/demo-template/angular-product-app/src/main/webapp/js/app.js +++ b/examples/demo-template/angular-product-app/src/main/webapp/js/app.js @@ -16,7 +16,7 @@ angular.element(document).ready(function ($http) { keycloakAuth.init({ onLoad: 'login-required' }).success(function () { auth.loggedIn = true; auth.authz = keycloakAuth; - auth.logoutUrl = keycloakAuth.authServerUrl + "/realms/demo/tokens/logout?redirect_uri=http://localhost:8080/angular-product/index.html"; + auth.logoutUrl = keycloakAuth.authServerUrl + "/realms/demo/tokens/logout?redirect_uri=/angular-product/index.html"; module.factory('Auth', function() { return auth; }); diff --git a/examples/demo-template/angular-product-app/src/main/webapp/keycloak.json b/examples/demo-template/angular-product-app/src/main/webapp/keycloak.json index 1efffef660..a55fae369d 100755 --- a/examples/demo-template/angular-product-app/src/main/webapp/keycloak.json +++ b/examples/demo-template/angular-product-app/src/main/webapp/keycloak.json @@ -1,7 +1,7 @@ { "realm" : "demo", "realm-public-key" : "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB", - "auth-server-url" : "http://localhost:8080/auth", + "auth-server-url" : "/auth", "ssl-not-required" : true, "resource" : "angular-product", "public-client" : true diff --git a/examples/demo-template/customer-app-cli/src/main/java/org/keycloak/example/CustomerCli.java b/examples/demo-template/customer-app-cli/src/main/java/org/keycloak/example/CustomerCli.java index 824165b37b..a40df4c6c4 100644 --- a/examples/demo-template/customer-app-cli/src/main/java/org/keycloak/example/CustomerCli.java +++ b/examples/demo-template/customer-app-cli/src/main/java/org/keycloak/example/CustomerCli.java @@ -115,7 +115,10 @@ public class CustomerCli { } public static void customers() throws Exception { - String customersUrl = "http://localhost:8080/database/customers"; + String baseUrl = keycloak.getDeployment().getAuthServerBaseUrl(); + baseUrl = baseUrl.substring(0, baseUrl.indexOf('/', 8)); + + String customersUrl = baseUrl + "/database/customers"; HttpGet get = new HttpGet(customersUrl); get.setHeader("Accept", "application/json"); get.setHeader("Authorization", "Bearer " + keycloak.getTokenString(10, TimeUnit.SECONDS)); diff --git a/examples/demo-template/customer-app-js/src/main/webapp/customers/view.html b/examples/demo-template/customer-app-js/src/main/webapp/customers/view.html index 26ef5a341a..85a33547f5 100755 --- a/examples/demo-template/customer-app-js/src/main/webapp/customers/view.html +++ b/examples/demo-template/customer-app-js/src/main/webapp/customers/view.html @@ -5,7 +5,7 @@ -

Goto: products | logout | manage acct

+

Goto: products | logout | manage acct

User made this request.

User details (from )

diff --git a/examples/demo-template/customer-app-js/src/main/webapp/keycloak.json b/examples/demo-template/customer-app-js/src/main/webapp/keycloak.json index d73332e0eb..c35e126912 100644 --- a/examples/demo-template/customer-app-js/src/main/webapp/keycloak.json +++ b/examples/demo-template/customer-app-js/src/main/webapp/keycloak.json @@ -1,7 +1,7 @@ { "realm" : "demo", "realm-public-key" : "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB", - "auth-server-url" : "http://localhost:8080/auth", + "auth-server-url" : "/auth", "ssl-not-required" : true, "resource" : "customer-portal-js", "public-client" : true diff --git a/examples/demo-template/customer-app/src/main/java/org/keycloak/example/AdminClient.java b/examples/demo-template/customer-app/src/main/java/org/keycloak/example/AdminClient.java index f776c4c8eb..91b7422f63 100755 --- a/examples/demo-template/customer-app/src/main/java/org/keycloak/example/AdminClient.java +++ b/examples/demo-template/customer-app/src/main/java/org/keycloak/example/AdminClient.java @@ -43,7 +43,7 @@ public class AdminClient { HttpClient client = new HttpClientBuilder() .disableTrustManager().build(); try { - HttpGet get = new HttpGet("http://localhost:8080/auth/admin/realms/demo/roles"); + HttpGet get = new HttpGet(getBaseUrl(req) + "/auth/admin/realms/demo/roles"); get.addHeader("Authorization", "Bearer " + session.getTokenString()); try { HttpResponse response = client.execute(get); @@ -64,4 +64,10 @@ public class AdminClient { client.getConnectionManager().shutdown(); } } + + public static String getBaseUrl(HttpServletRequest request) { + String url = request.getRequestURL().toString(); + return url.substring(0, url.indexOf('/', 8)); + } + } diff --git a/examples/demo-template/customer-app/src/main/java/org/keycloak/example/CustomerDatabaseClient.java b/examples/demo-template/customer-app/src/main/java/org/keycloak/example/CustomerDatabaseClient.java index 9a112dbae5..83e6c7edcf 100755 --- a/examples/demo-template/customer-app/src/main/java/org/keycloak/example/CustomerDatabaseClient.java +++ b/examples/demo-template/customer-app/src/main/java/org/keycloak/example/CustomerDatabaseClient.java @@ -48,7 +48,7 @@ public class CustomerDatabaseClient { HttpClient client = new HttpClientBuilder() .disableTrustManager().build(); try { - HttpGet get = new HttpGet("http://localhost:8080/database/customers"); + HttpGet get = new HttpGet(getBaseUrl(req) + "/database/customers"); get.addHeader("Authorization", "Bearer " + session.getTokenString()); try { HttpResponse response = client.execute(get); @@ -69,4 +69,9 @@ public class CustomerDatabaseClient { client.getConnectionManager().shutdown(); } } + + public static String getBaseUrl(HttpServletRequest request) { + String url = request.getRequestURL().toString(); + return url.substring(0, url.indexOf('/', 8)); + } } diff --git a/examples/demo-template/customer-app/src/main/webapp/WEB-INF/keycloak.json b/examples/demo-template/customer-app/src/main/webapp/WEB-INF/keycloak.json index 50ec3d330e..d4d8f0a4cb 100755 --- a/examples/demo-template/customer-app/src/main/webapp/WEB-INF/keycloak.json +++ b/examples/demo-template/customer-app/src/main/webapp/WEB-INF/keycloak.json @@ -2,7 +2,7 @@ "realm": "demo", "resource": "customer-portal", "realm-public-key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB", - "auth-server-url": "http://localhost:8080/auth", + "auth-server-url": "/auth", "ssl-not-required": true, "expose-token": true, "credentials": { diff --git a/examples/demo-template/customer-app/src/main/webapp/customers/view.jsp b/examples/demo-template/customer-app/src/main/webapp/customers/view.jsp index 1ef5855f14..799f63de4b 100755 --- a/examples/demo-template/customer-app/src/main/webapp/customers/view.jsp +++ b/examples/demo-template/customer-app/src/main/webapp/customers/view.jsp @@ -10,13 +10,13 @@ <% - String logoutUri = KeycloakUriBuilder.fromUri("http://localhost:8080/auth").path(ServiceUrlConstants.TOKEN_SERVICE_LOGOUT_PATH) - .queryParam("redirect_uri", "http://localhost:8080/customer-portal").build("demo").toString(); - String acctUri = KeycloakUriBuilder.fromUri("http://localhost:8080/auth").path(ServiceUrlConstants.ACCOUNT_SERVICE_PATH) + String logoutUri = KeycloakUriBuilder.fromUri("/auth").path(ServiceUrlConstants.TOKEN_SERVICE_LOGOUT_PATH) + .queryParam("redirect_uri", "/customer-portal").build("demo").toString(); + String acctUri = KeycloakUriBuilder.fromUri("/auth").path(ServiceUrlConstants.ACCOUNT_SERVICE_PATH) .queryParam("referrer", "customer-portal").build("demo").toString(); IDToken idToken = CustomerDatabaseClient.getIDToken(request); %> -

Goto: products | logout | Goto: products | logout | manage acct

Servlet User Principal <%=request.getUserPrincipal().getName()%> made this request. diff --git a/examples/demo-template/product-app/src/main/java/org/keycloak/example/oauth/ProductDatabaseClient.java b/examples/demo-template/product-app/src/main/java/org/keycloak/example/oauth/ProductDatabaseClient.java index 6d70dcf196..79827b3ffc 100755 --- a/examples/demo-template/product-app/src/main/java/org/keycloak/example/oauth/ProductDatabaseClient.java +++ b/examples/demo-template/product-app/src/main/java/org/keycloak/example/oauth/ProductDatabaseClient.java @@ -39,7 +39,7 @@ public class ProductDatabaseClient HttpClient client = new HttpClientBuilder() .disableTrustManager().build(); try { - HttpGet get = new HttpGet("http://localhost:8080/database/products"); + HttpGet get = new HttpGet(getBaseUrl(req) + "/database/products"); get.addHeader("Authorization", "Bearer " + session.getTokenString()); try { HttpResponse response = client.execute(get); @@ -61,4 +61,9 @@ public class ProductDatabaseClient } } + public static String getBaseUrl(HttpServletRequest request) { + String url = request.getRequestURL().toString(); + return url.substring(0, url.indexOf('/', 8)); + } + } diff --git a/examples/demo-template/product-app/src/main/webapp/WEB-INF/keycloak.json b/examples/demo-template/product-app/src/main/webapp/WEB-INF/keycloak.json index ab28c0f648..2a7dbd25bf 100755 --- a/examples/demo-template/product-app/src/main/webapp/WEB-INF/keycloak.json +++ b/examples/demo-template/product-app/src/main/webapp/WEB-INF/keycloak.json @@ -2,7 +2,7 @@ "realm" : "demo", "resource" : "product-portal", "realm-public-key" : "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB", - "auth-server-url" : "http://localhost:8080/auth", + "auth-server-url" : "/auth", "ssl-not-required" : true, "credentials" : { "secret": "password" diff --git a/examples/demo-template/product-app/src/main/webapp/products/view.jsp b/examples/demo-template/product-app/src/main/webapp/products/view.jsp index ad12e8a245..e8bc1189ef 100755 --- a/examples/demo-template/product-app/src/main/webapp/products/view.jsp +++ b/examples/demo-template/product-app/src/main/webapp/products/view.jsp @@ -9,13 +9,13 @@ <% - String logoutUri = KeycloakUriBuilder.fromUri("http://localhost:8080/auth").path(ServiceUrlConstants.TOKEN_SERVICE_LOGOUT_PATH) - .queryParam("redirect_uri", "http://localhost:8080/customer-portal").build("demo").toString(); - String acctUri = KeycloakUriBuilder.fromUri("http://localhost:8080/auth").path(ServiceUrlConstants.ACCOUNT_SERVICE_PATH) + String logoutUri = KeycloakUriBuilder.fromUri("/auth").path(ServiceUrlConstants.TOKEN_SERVICE_LOGOUT_PATH) + .queryParam("redirect_uri", "/customer-portal").build("demo").toString(); + String acctUri = KeycloakUriBuilder.fromUri("/auth").path(ServiceUrlConstants.ACCOUNT_SERVICE_PATH) .queryParam("referrer", "product-portal").build("demo").toString(); %> -

Goto: customers | logout | manage acct

+

Goto: customers | logout | manage acct

User <%=request.getUserPrincipal().getName()%> made this request.

Product Listing

<% diff --git a/examples/demo-template/subsystem-config.xml b/examples/demo-template/subsystem-config.xml index 977eb8b5f9..59bdd6f3fe 100755 --- a/examples/demo-template/subsystem-config.xml +++ b/examples/demo-template/subsystem-config.xml @@ -2,7 +2,7 @@ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB - http://localhost:8080/auth + /auth true diff --git a/examples/demo-template/testrealm.json b/examples/demo-template/testrealm.json index f3213334d6..3c44a07672 100755 --- a/examples/demo-template/testrealm.json +++ b/examples/demo-template/testrealm.json @@ -89,10 +89,10 @@ { "name": "customer-portal", "enabled": true, - "adminUrl": "http://localhost:8080/customer-portal", - "baseUrl": "http://localhost:8080/customer-portal", + "adminUrl": "/customer-portal", + "baseUrl": "/customer-portal", "redirectUris": [ - "http://localhost:8080/customer-portal/*" + "/customer-portal/*" ], "secret": "password" }, @@ -100,18 +100,18 @@ "name": "customer-portal-js", "enabled": true, "publicClient": true, - "baseUrl": "http://localhost:8080/customer-portal-js", + "baseUrl": "/customer-portal-js", "redirectUris": [ - "http://localhost:8080/customer-portal-js/*" + "/customer-portal-js/*" ] }, { "name": "angular-product", "enabled": true, "publicClient": true, - "baseUrl": "http://localhost:8080/angular-product/index.html", + "baseUrl": "/angular-product/index.html", "redirectUris": [ - "http://localhost:8080/angular-product/*" + "/angular-product/*" ] }, { @@ -126,10 +126,10 @@ { "name": "product-portal", "enabled": true, - "adminUrl": "http://localhost:8080/product-portal", - "baseUrl": "http://localhost:8080/product-portal", + "adminUrl": "/product-portal", + "baseUrl": "/product-portal", "redirectUris": [ - "http://localhost:8080/product-portal/*" + "/product-portal/*" ], "secret": "password" } @@ -139,8 +139,8 @@ "name": "third-party", "enabled": true, "redirectUris": [ - "http://localhost:8080/oauth-client/*", - "http://localhost:8080/oauth-client-cdi/*" + "/oauth-client/*", + "/oauth-client-cdi/*" ], "secret": "password" }, diff --git a/examples/demo-template/third-party-cdi/src/main/java/org/keycloak/example/oauth/DatabaseClient.java b/examples/demo-template/third-party-cdi/src/main/java/org/keycloak/example/oauth/DatabaseClient.java index a2389e3799..d76c55cf83 100755 --- a/examples/demo-template/third-party-cdi/src/main/java/org/keycloak/example/oauth/DatabaseClient.java +++ b/examples/demo-template/third-party-cdi/src/main/java/org/keycloak/example/oauth/DatabaseClient.java @@ -58,12 +58,12 @@ public class DatabaseClient { static class TypedList extends ArrayList {} public void sendCustomersRequest() { - List customers = sendRequestToDBApplication("http://localhost:8080/database/customers"); + List customers = sendRequestToDBApplication(getBaseUrl() + "/database/customers"); userData.setCustomers(customers); } public void sendProductsRequest() { - List products = sendRequestToDBApplication("http://localhost:8080/database/products"); + List products = sendRequestToDBApplication(getBaseUrl() + "/database/products"); userData.setProducts(products); } @@ -100,4 +100,11 @@ public class DatabaseClient { return null; } } + + public String getBaseUrl() { + String url = request.getRequestURL().toString(); + return url.substring(0, url.indexOf('/', 8)); + } + + } diff --git a/examples/demo-template/third-party-cdi/src/main/webapp/WEB-INF/keycloak.json b/examples/demo-template/third-party-cdi/src/main/webapp/WEB-INF/keycloak.json index f7da55ef28..a4635bba14 100755 --- a/examples/demo-template/third-party-cdi/src/main/webapp/WEB-INF/keycloak.json +++ b/examples/demo-template/third-party-cdi/src/main/webapp/WEB-INF/keycloak.json @@ -1,7 +1,7 @@ { "realm" : "demo", "resource" : "third-party", - "auth-server-url" : "http://localhost:8080/auth", + "auth-server-url" : "/auth", "ssl-not-required" : true, "credentials" : { "secret": "password" diff --git a/examples/demo-template/third-party/src/main/java/org/keycloak/example/oauth/ProductDatabaseClient.java b/examples/demo-template/third-party/src/main/java/org/keycloak/example/oauth/ProductDatabaseClient.java index 4ddd049942..d9377c93d8 100755 --- a/examples/demo-template/third-party/src/main/java/org/keycloak/example/oauth/ProductDatabaseClient.java +++ b/examples/demo-template/third-party/src/main/java/org/keycloak/example/oauth/ProductDatabaseClient.java @@ -78,7 +78,7 @@ public class ProductDatabaseClient { ServletOAuthClient oAuthClient = (ServletOAuthClient) request.getServletContext().getAttribute(ServletOAuthClient.class.getName()); HttpClient client = oAuthClient.getClient(); - HttpGet get = new HttpGet("http://localhost:8080/database/products"); + HttpGet get = new HttpGet(getBaseUrl(request) + "/database/products"); get.addHeader("Authorization", "Bearer " + accessToken); try { HttpResponse response = client.execute(get); @@ -96,4 +96,10 @@ public class ProductDatabaseClient { throw new RuntimeException(e); } } + + public static String getBaseUrl(HttpServletRequest request) { + String url = request.getRequestURL().toString(); + return url.substring(0, url.indexOf('/', 8)); + } + } diff --git a/examples/demo-template/third-party/src/main/webapp/WEB-INF/keycloak.json b/examples/demo-template/third-party/src/main/webapp/WEB-INF/keycloak.json index f7da55ef28..a4635bba14 100755 --- a/examples/demo-template/third-party/src/main/webapp/WEB-INF/keycloak.json +++ b/examples/demo-template/third-party/src/main/webapp/WEB-INF/keycloak.json @@ -1,7 +1,7 @@ { "realm" : "demo", "resource" : "third-party", - "auth-server-url" : "http://localhost:8080/auth", + "auth-server-url" : "/auth", "ssl-not-required" : true, "credentials" : { "secret": "password" diff --git a/examples/js-console/example-realm.json b/examples/js-console/example-realm.json index ab43028824..35e8d2730f 100755 --- a/examples/js-console/example-realm.json +++ b/examples/js-console/example-realm.json @@ -46,13 +46,11 @@ "name": "js-console", "enabled": true, "publicClient": true, - "baseUrl": "http://localhost:8080/js-console", + "baseUrl": "/js-console", "redirectUris": [ - "http://localhost:8080/js-console/*" + "/js-console/*" ], - "webOrigins": [ - "http://localhost:8080" - ] + "webOrigins": [] } ], "applicationScopeMappings": { diff --git a/examples/js-console/src/main/webapp/keycloak.json b/examples/js-console/src/main/webapp/keycloak.json index 286d87b9f6..6f157b2160 100644 --- a/examples/js-console/src/main/webapp/keycloak.json +++ b/examples/js-console/src/main/webapp/keycloak.json @@ -1,7 +1,7 @@ { "realm" : "example", "realm-public-key" : "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB", - "auth-server-url" : "http://localhost:8080/auth", + "auth-server-url" : "/auth", "ssl-not-required" : true, "resource" : "js-console", "public-client" : true diff --git a/integration/servlet-oauth-client/src/main/java/org/keycloak/servlet/ServletOAuthClient.java b/integration/servlet-oauth-client/src/main/java/org/keycloak/servlet/ServletOAuthClient.java index 461b0bd31f..95dbf1efc3 100755 --- a/integration/servlet-oauth-client/src/main/java/org/keycloak/servlet/ServletOAuthClient.java +++ b/integration/servlet-oauth-client/src/main/java/org/keycloak/servlet/ServletOAuthClient.java @@ -40,8 +40,8 @@ public class ServletOAuthClient extends AbstractOAuthClient { this.client = client; } - public AccessTokenResponse resolveBearerToken(String redirectUri, String code) throws IOException, ServerRequest.HttpFailure { - return ServerRequest.invokeAccessCodeToToken(client, publicClient, code, codeUrl, redirectUri, clientId, credentials); + private AccessTokenResponse resolveBearerToken(HttpServletRequest request, String redirectUri, String code) throws IOException, ServerRequest.HttpFailure { + return ServerRequest.invokeAccessCodeToToken(client, publicClient, code, getUrl(request, codeUrl), redirectUri, clientId, credentials); } /** @@ -75,7 +75,7 @@ public class ServletOAuthClient extends AbstractOAuthClient { public void redirect(String redirectUri, HttpServletRequest request, HttpServletResponse response) throws IOException { String state = getStateCode(); - KeycloakUriBuilder uriBuilder = KeycloakUriBuilder.fromUri(authUrl) + KeycloakUriBuilder uriBuilder = KeycloakUriBuilder.fromUri(getUrl(request, authUrl)) .queryParam(OAuth2Constants.CLIENT_ID, clientId) .queryParam(OAuth2Constants.REDIRECT_URI, redirectUri) .queryParam(OAuth2Constants.STATE, state); @@ -143,11 +143,11 @@ public class ServletOAuthClient extends AbstractOAuthClient { throw new IOException("state parameter invalid"); } if (code == null) throw new IOException("code parameter was null"); - return resolveBearerToken(redirectUri, code); + return resolveBearerToken(request, redirectUri, code); } - public AccessTokenResponse refreshToken(String refreshToken) throws IOException, ServerRequest.HttpFailure { - return ServerRequest.invokeRefresh(client, publicClient, refreshToken, refreshUrl, clientId, credentials); + public AccessTokenResponse refreshToken(HttpServletRequest request, String refreshToken) throws IOException, ServerRequest.HttpFailure { + return ServerRequest.invokeRefresh(client, publicClient, refreshToken, getUrl(request, refreshUrl), clientId, credentials); } public static IDToken extractIdToken(String idToken) { @@ -160,5 +160,14 @@ public class ServletOAuthClient extends AbstractOAuthClient { } } + private String getUrl(HttpServletRequest request, String url) { + if (relativeUrls) { + String baseUrl = request.getRequestURL().toString(); + baseUrl = baseUrl.substring(0, baseUrl.indexOf('/', 8)); + return baseUrl + url; + } else { + return url; + } + } } diff --git a/integration/servlet-oauth-client/src/main/java/org/keycloak/servlet/ServletOAuthClientBuilder.java b/integration/servlet-oauth-client/src/main/java/org/keycloak/servlet/ServletOAuthClientBuilder.java index 54095beea8..52d9710f3c 100755 --- a/integration/servlet-oauth-client/src/main/java/org/keycloak/servlet/ServletOAuthClientBuilder.java +++ b/integration/servlet-oauth-client/src/main/java/org/keycloak/servlet/ServletOAuthClientBuilder.java @@ -50,6 +50,8 @@ public class ServletOAuthClientBuilder { throw new RuntimeException("You must specify auth-url"); } KeycloakUriBuilder serverBuilder = KeycloakUriBuilder.fromUri(adapterConfig.getAuthServerUrl()); + oauthClient.setRelativeUrls(serverBuilder.clone().getHost() == null); + String authUrl = serverBuilder.clone().path(ServiceUrlConstants.TOKEN_SERVICE_LOGIN_PATH).build(adapterConfig.getRealm()).toString(); String tokenUrl = serverBuilder.clone().path(ServiceUrlConstants.TOKEN_SERVICE_ACCESS_CODE_PATH).build(adapterConfig.getRealm()).toString(); String refreshUrl = serverBuilder.clone().path(ServiceUrlConstants.TOKEN_SERVICE_REFRESH_PATH).build(adapterConfig.getRealm()).toString(); diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java index 57d229aaeb..f3b751e260 100755 --- a/services/src/main/java/org/keycloak/services/resources/AccountService.java +++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java @@ -222,10 +222,12 @@ public class AccountService { requireOneOf(AccountRoles.MANAGE_ACCOUNT, AccountRoles.VIEW_PROFILE); UserRepresentation rep = ModelToRepresentation.toRepresentation(auth.getUser()); - Iterator itr = rep.getAttributes().keySet().iterator(); - while (itr.hasNext()) { - if (itr.next().startsWith("keycloak.")) { - itr.remove(); + if (rep.getAttributes() != null) { + Iterator itr = rep.getAttributes().keySet().iterator(); + while (itr.hasNext()) { + if (itr.next().startsWith("keycloak.")) { + itr.remove(); + } } }