keycloak-memoizeit

remove /rest from RealmsResource

5/6/2014 9:21:49 PM

Changes

Details

diff --git a/core/src/main/java/org/keycloak/ServiceUrlConstants.java b/core/src/main/java/org/keycloak/ServiceUrlConstants.java
index 6538064..2d6387f 100755
--- a/core/src/main/java/org/keycloak/ServiceUrlConstants.java
+++ b/core/src/main/java/org/keycloak/ServiceUrlConstants.java
@@ -6,11 +6,11 @@ package org.keycloak;
  */
 public interface ServiceUrlConstants {
 
-    public static final String TOKEN_SERVICE_LOGIN_PATH = "/rest/realms/{realm-name}/tokens/login";
-    public static final String TOKEN_SERVICE_ACCESS_CODE_PATH = "/rest/realms/{realm-name}/tokens/access/codes";
-    public static final String TOKEN_SERVICE_REFRESH_PATH = "/rest/realms/{realm-name}/tokens/refresh";
-    public static final String TOKEN_SERVICE_LOGOUT_PATH = "/rest/realms/{realm-name}/tokens/logout";
-    public static final String ACCOUNT_SERVICE_PATH = "/rest/realms/{realm-name}/account";
-    public static final String REALM_INFO_PATH = "/rest/realms/{realm-name}";
+    public static final String TOKEN_SERVICE_LOGIN_PATH = "/realms/{realm-name}/tokens/login";
+    public static final String TOKEN_SERVICE_ACCESS_CODE_PATH = "/realms/{realm-name}/tokens/access/codes";
+    public static final String TOKEN_SERVICE_REFRESH_PATH = "/realms/{realm-name}/tokens/refresh";
+    public static final String TOKEN_SERVICE_LOGOUT_PATH = "/realms/{realm-name}/tokens/logout";
+    public static final String ACCOUNT_SERVICE_PATH = "/realms/{realm-name}/account";
+    public static final String REALM_INFO_PATH = "/realms/{realm-name}";
 
 }
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 7aaa988..2334e76 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
@@ -3,15 +3,17 @@
 <%@ page import="org.keycloak.example.CustomerDatabaseClient" %>
 <%@ page import="org.keycloak.util.KeycloakUriBuilder" %>
 <%@ page import="org.keycloak.representations.IDToken" %>
+<%@ page import="org.keycloak.ServiceUrlConstants" %>
 <html>
 <head>
     <title>Customer View Page</title>
 </head>
 <body bgcolor="#E3F6CE">
 <%
-    String logoutUri = KeycloakUriBuilder.fromUri("http://localhost:8080/auth/rest/realms/demo/tokens/logout")
-            .queryParam("redirect_uri", "http://localhost:8080/customer-portal").build().toString();
-    String acctUri = "http://localhost:8080/auth/rest/realms/demo/account?referrer=customer-portal";
+    String logoutUri = KeycloakUriBuilder.fromUri("http://localhost:8080/auth").path(ServiceUrlConstants.TOKEN_SERVICE_LOGIN_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)
+            .queryParam("referrer", "customer-portal").build("demo").toString();
     IDToken idToken = CustomerDatabaseClient.getIDToken(request);
 %>
 <p>Goto: <a href="http://localhost:8080/product-portal">products</a> | <a href="<%=logoutUri%>">logout</a> | <a
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 6592f8f..b25f990 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
@@ -2,15 +2,17 @@
  pageEncoding="ISO-8859-1"%>
 <%@ page import="org.keycloak.example.oauth.ProductDatabaseClient" %>
 <%@ page import="org.keycloak.util.KeycloakUriBuilder" %>
+<%@ page import="org.keycloak.ServiceUrlConstants" %>
 <html>
 <head>
     <title>Product View Page</title>
 </head>
 <body bgcolor="#F5F6CE">
 <%
-   String logoutUri = KeycloakUriBuilder.fromUri("http://localhost:8080/auth/rest/realms/demo/tokens/logout")
-                                     .queryParam("redirect_uri", "http://localhost:8080/product-portal").build().toString();
-    String acctUri =   "http://localhost:8080/auth/rest/realms/demo/account?referrer=product-portal";
+    String logoutUri = KeycloakUriBuilder.fromUri("http://localhost:8080/auth").path(ServiceUrlConstants.TOKEN_SERVICE_LOGIN_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)
+            .queryParam("referrer", "product-portal").build("demo").toString();
 %>
 
 <p>Goto: <a href="http://localhost:8080/customer-portal">customers</a> | <a href="<%=logoutUri%>">logout</a> | <a href="<%=acctUri%>">manage acct</a></p>
diff --git a/integration/as7-eap-subsystem/src/test/java/org/keycloak/subsystem/extension/RealmDefinitionTestCase.java b/integration/as7-eap-subsystem/src/test/java/org/keycloak/subsystem/extension/RealmDefinitionTestCase.java
index 809bf5c..6c67895 100755
--- a/integration/as7-eap-subsystem/src/test/java/org/keycloak/subsystem/extension/RealmDefinitionTestCase.java
+++ b/integration/as7-eap-subsystem/src/test/java/org/keycloak/subsystem/extension/RealmDefinitionTestCase.java
@@ -37,8 +37,8 @@ public class RealmDefinitionTestCase {
         model.get("realm").set("demo");
         model.get("resource").set("customer-portal");
         model.get("realm-public-key").set("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB");
-        model.get("auth-url").set("http://localhost:8080/auth-server/rest/realms/demo/tokens/login");
-        model.get("code-url").set("http://localhost:8080/auth-server/rest/realms/demo/tokens/access/codes");
+        model.get("auth-url").set("http://localhost:8080/auth-server/realms/demo/tokens/login");
+        model.get("code-url").set("http://localhost:8080/auth-server/realms/demo/tokens/access/codes");
         model.get("expose-token").set(true);
         ModelNode credential = new ModelNode();
         credential.get("password").set("password");
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 2f998e7..1a45b6c 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -167,6 +167,10 @@ public class AccountService {
         return base;
     }
 
+    public static UriBuilder accountServiceBaseUrl(UriBuilder base) {
+        return base.path(RealmsResource.class).path(RealmsResource.class, "getAccountService");
+    }
+
     private Response forwardToPage(String path, AccountPages page) {
         if (auth != null) {
             try {
@@ -207,24 +211,39 @@ public class AccountService {
         }
     }
 
+    public static UriBuilder totpUrl(UriBuilder base) {
+        return RealmsResource.accountUrl(base).path(AccountService.class, "totpPage");
+    }
     @Path("totp")
     @GET
     public Response totpPage() {
         return forwardToPage("totp", AccountPages.TOTP);
     }
 
+    public static UriBuilder passwordUrl(UriBuilder base) {
+        return RealmsResource.accountUrl(base).path(AccountService.class, "passwordPage");
+    }
     @Path("password")
     @GET
     public Response passwordPage() {
         return forwardToPage("password", AccountPages.PASSWORD);
     }
 
+
+    public static UriBuilder socialUrl(UriBuilder base) {
+        return RealmsResource.accountUrl(base).path(AccountService.class, "socialPage");
+    }
+
     @Path("social")
     @GET
     public Response socialPage() {
         return forwardToPage("social", AccountPages.SOCIAL);
     }
 
+    public static UriBuilder logUrl(UriBuilder base) {
+        return RealmsResource.accountUrl(base).path(AccountService.class, "logPage");
+    }
+
     @Path("log")
     @GET
     public Response logPage() {
@@ -422,6 +441,10 @@ public class AccountService {
         }
     }
 
+    public static UriBuilder loginRedirectUrl(UriBuilder base) {
+        return RealmsResource.accountUrl(base).path(AccountService.class, "loginRedirect");
+    }
+
     @Path("login-redirect")
     @GET
     public Response loginRedirect(@QueryParam("code") String code,
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ConsoleLogin.java b/services/src/main/java/org/keycloak/services/resources/admin/ConsoleLogin.java
new file mode 100755
index 0000000..c2a0429
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/admin/ConsoleLogin.java
@@ -0,0 +1,410 @@
+package org.keycloak.services.resources.admin;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.jboss.logging.Logger;
+import org.jboss.resteasy.annotations.cache.NoCache;
+import org.jboss.resteasy.spi.HttpRequest;
+import org.jboss.resteasy.spi.HttpResponse;
+import org.jboss.resteasy.spi.NotFoundException;
+import org.jboss.resteasy.spi.ResteasyProviderFactory;
+import org.jboss.resteasy.spi.UnauthorizedException;
+import org.keycloak.OAuth2Constants;
+import org.keycloak.models.AdminRoles;
+import org.keycloak.models.ApplicationModel;
+import org.keycloak.models.Config;
+import org.keycloak.models.Constants;
+import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.RealmModel;
+import org.keycloak.models.RoleModel;
+import org.keycloak.models.UserModel;
+import org.keycloak.provider.ProviderSession;
+import org.keycloak.services.managers.AppAuthManager;
+import org.keycloak.services.managers.Auth;
+import org.keycloak.services.managers.RealmManager;
+import org.keycloak.services.managers.TokenManager;
+import org.keycloak.services.resources.TokenService;
+import org.keycloak.services.resources.flows.Flows;
+import org.keycloak.services.resources.flows.OAuthRedirect;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.NewCookie;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriBuilder;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.ext.Providers;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
+ * @version $Revision: 1 $
+ */
+public class ConsoleLogin {
+    protected static final Logger logger = Logger.getLogger(ConsoleLogin.class);
+
+    @Context
+    protected UriInfo uriInfo;
+
+    @Context
+    protected HttpRequest request;
+
+    @Context
+    protected HttpResponse response;
+
+    @Context
+    protected KeycloakSession session;
+
+    /*
+    @Context
+    protected ResourceContext resourceContext;
+    */
+
+    @Context
+    protected Providers providers;
+
+    @Context
+    protected ProviderSession providerSession;
+
+    protected String adminPath = "/admin/";
+    protected AppAuthManager authManager;
+    protected TokenManager tokenManager;
+    protected RealmModel realm;
+
+    public ConsoleLogin(TokenManager tokenManager, RealmModel realm) {
+        this.realm = realm;
+        this.tokenManager = tokenManager;
+        this.authManager = new AppAuthManager(providerSession, "KEYCLOAK_ADMIN_CONSOLE_IDENTITY", tokenManager);
+    }
+
+    public static UriBuilder adminApiUrl(UriInfo uriInfo) {
+        UriBuilder base = uriInfo.getBaseUriBuilder().path(ConsoleLogin.class).path(ConsoleLogin.class, "getRealmsAdmin").path(RealmsAdminResource.class, "getRealmAdmin");
+        return base;
+    }
+
+
+    public static class WhoAmI {
+        protected String userId;
+        protected String realm;
+        protected String displayName;
+
+        @JsonProperty("createRealm")
+        protected boolean createRealm;
+        @JsonProperty("realm_access")
+        protected Map<String, Set<String>> realmAccess = new HashMap<String, Set<String>>();
+
+        public WhoAmI() {
+        }
+
+        public WhoAmI(String userId, String realm, String displayName, boolean createRealm, Map<String, Set<String>> realmAccess) {
+            this.userId = userId;
+            this.realm = realm;
+            this.displayName = displayName;
+            this.createRealm = createRealm;
+            this.realmAccess = realmAccess;
+        }
+
+        public String getUserId() {
+            return userId;
+        }
+
+        public void setUserId(String userId) {
+            this.userId = userId;
+        }
+
+        public String getRealm() {
+            return realm;
+        }
+
+        public void setRealm(String realm) {
+            this.realm = realm;
+        }
+
+        public String getDisplayName() {
+            return displayName;
+        }
+
+        public void setDisplayName(String displayName) {
+            this.displayName = displayName;
+        }
+
+        public boolean isCreateRealm() {
+            return createRealm;
+        }
+
+        public void setCreateRealm(boolean createRealm) {
+            this.createRealm = createRealm;
+        }
+
+        public Map<String, Set<String>> getRealmAccess() {
+            return realmAccess;
+        }
+
+        public void setRealmAccess(Map<String, Set<String>> realmAccess) {
+            this.realmAccess = realmAccess;
+        }
+    }
+
+    @Path("keepalive")
+    @GET
+    @NoCache
+    public Response keepalive(final @Context HttpHeaders headers) {
+        logger.debug("keepalive");
+        RealmManager realmManager = new RealmManager(session);
+        RealmModel realm = getAdminstrationRealm(realmManager);
+        if (realm == null)
+            throw new NotFoundException("No realm found");
+        Auth auth = authManager.authenticateCookie(realm, headers);
+        if (auth == null) {
+            return Response.status(401).build();
+        }
+        NewCookie refreshCookie = authManager.createRefreshCookie(realm, auth.getUser(), auth.getClient(), ConsoleLogin.saasCookiePath(uriInfo).build());
+        return Response.noContent().cookie(refreshCookie).build();
+    }
+
+    @Path("whoami")
+    @GET
+    @Produces("application/json")
+    @NoCache
+    public Response whoAmI(final @Context HttpHeaders headers) {
+        RealmManager realmManager = new RealmManager(session);
+        RealmModel realm = getAdminstrationRealm(realmManager);
+        if (realm == null)
+            throw new NotFoundException("No realm found");
+        Auth auth = authManager.authenticateCookie(realm, headers);
+        if (auth == null) {
+            logger.debug("No auth cookie");
+            return Response.status(401).build();
+        }
+        UserModel user = auth.getUser();
+        if (user == null) {
+            return Response.status(401).build();
+        }
+
+        String displayName;
+        if (user.getFirstName() != null || user.getLastName() != null) {
+            displayName = user.getFirstName();
+            if (user.getLastName() != null) {
+                displayName = displayName != null ? displayName + " " + user.getLastName() : user.getLastName();
+            }
+        } else {
+            displayName = user.getLoginName();
+        }
+
+        boolean createRealm = realm.hasRole(user, realm.getRole(AdminRoles.CREATE_REALM));
+
+        Map<String, Set<String>> realmAccess = new HashMap<String, Set<String>>();
+        addRealmAdminAccess(realmAccess, auth.getRealm().getRoleMappings(auth.getUser()));
+
+        return Response.ok(new WhoAmI(user.getId(), Config.getAdminRealm(), displayName, createRealm, realmAccess)).build();
+    }
+
+    private void addRealmAdminAccess(Map<String, Set<String>> realmAdminAccess, Set<RoleModel> roles) {
+        for (RoleModel r : roles) {
+            if (r.getContainer() instanceof ApplicationModel) {
+                ApplicationModel app = (ApplicationModel) r.getContainer();
+                if (app.getName().endsWith(AdminRoles.APP_SUFFIX)) {
+                    String realm = app.getName().substring(0, app.getName().length() - AdminRoles.APP_SUFFIX.length());
+                    if (!realmAdminAccess.containsKey(realm)) {
+                        realmAdminAccess.put(realm, new HashSet<String>());
+                    }
+                    realmAdminAccess.get(realm).add(r.getName());
+                }
+            }
+
+            if (r.isComposite()) {
+                addRealmAdminAccess(realmAdminAccess, r.getComposites());
+            }
+        }
+    }
+
+    @Path("isLoggedIn.js")
+    @GET
+    @Produces("application/javascript")
+    @NoCache
+    public String isLoggedIn(final @Context HttpHeaders headers) {
+        logger.debug("WHOAMI Javascript start.");
+        RealmManager realmManager = new RealmManager(session);
+        RealmModel realm = getAdminstrationRealm(realmManager);
+        if (realm == null) {
+            return "var keycloakCookieLoggedIn = false;";
+
+        }
+        UserModel user = authManager.authenticateCookie(realm, headers).getUser();
+        if (user == null) {
+            return "var keycloakCookieLoggedIn = false;";
+        }
+        logger.debug("WHOAMI: " + user.getLoginName());
+        return "var keycloakCookieLoggedIn = true;";
+    }
+
+    public static UriBuilder contextRoot(UriInfo uriInfo) {
+        return UriBuilder.fromUri(uriInfo.getBaseUri()).replacePath("/auth");
+    }
+
+    public static UriBuilder saasCookiePath(UriInfo uriInfo) {
+        return UriBuilder.fromUri(uriInfo.getBaseUri()).path(ConsoleLogin.class);
+    }
+
+    @Path("realms")
+    public RealmsAdminResource getRealmsAdmin(@Context final HttpHeaders headers) {
+        RealmManager realmManager = new RealmManager(session);
+        RealmModel adminRealm = getAdminstrationRealm(realmManager);
+        if (adminRealm == null)
+            throw new NotFoundException("Admin realm not found");
+        Auth auth = authManager.authenticate(adminRealm, headers);
+        if (auth == null) {
+            throw new UnauthorizedException("Bearer");
+        }
+
+        RealmsAdminResource adminResource = new RealmsAdminResource(auth, tokenManager);
+        ResteasyProviderFactory.getInstance().injectProperties(adminResource);
+        //resourceContext.initResource(adminResource);
+        return adminResource;
+    }
+
+    @Path("serverinfo")
+    public ServerInfoAdminResource getServerInfo(@Context final HttpHeaders headers) {
+        RealmManager realmManager = new RealmManager(session);
+        RealmModel adminRealm = getAdminstrationRealm(realmManager);
+        if (adminRealm == null)
+            throw new NotFoundException("Admin realm not found");
+        Auth auth = authManager.authenticate(adminRealm, headers);
+        UserModel admin = auth.getUser();
+        if (admin == null) {
+            throw new UnauthorizedException("Bearer");
+        }
+        ApplicationModel adminConsole = adminRealm.getApplicationNameMap().get(Constants.ADMIN_CONSOLE_APPLICATION);
+        if (adminConsole == null) {
+            throw new NotFoundException("Admin console application not found");
+        }
+        ServerInfoAdminResource adminResource = new ServerInfoAdminResource();
+        ResteasyProviderFactory.getInstance().injectProperties(adminResource);
+        //resourceContext.initResource(adminResource);
+        return adminResource;
+    }
+
+    private void expireCookie() {
+        authManager.expireCookie(ConsoleLogin.saasCookiePath(uriInfo).build());
+    }
+
+    @Path("login")
+    @GET
+    @NoCache
+    public Response loginPage(@QueryParam("path") String path) {
+        logger.debug("loginPage ********************** <---");
+        expireCookie();
+
+        OAuthRedirect oauth = new OAuthRedirect();
+        String authUrl = TokenService.loginPageUrl(uriInfo).build(Config.getAdminRealm()).toString();
+        logger.debugv("authUrl: {0}", authUrl);
+        oauth.setAuthUrl(authUrl);
+        oauth.setClientId(Constants.ADMIN_CONSOLE_APPLICATION);
+
+        UriBuilder redirectBuilder = uriInfo.getBaseUriBuilder().path(ConsoleLogin.class).path(ConsoleLogin.class, "loginRedirect");
+        if (path != null) {
+            redirectBuilder.queryParam("path", path);
+        }
+        URI redirectUri = redirectBuilder.build();
+        logger.debugv("redirectUri: {0}", redirectUri.toString());
+        oauth.setStateCookiePath(redirectUri.getRawPath());
+        return oauth.redirect(uriInfo, redirectUri.toString());
+    }
+
+    @Path("login-error")
+    @GET
+    @NoCache
+    public Response errorOnLoginRedirect(@QueryParam ("error") String message) {
+        RealmManager realmManager = new RealmManager(session);
+        RealmModel realm = getAdminstrationRealm(realmManager);
+        return Flows.forms(realm, uriInfo).setError(message).createErrorPage();
+    }
+
+    protected Response redirectOnLoginError(String message) {
+        URI uri = uriInfo.getBaseUriBuilder().path(ConsoleLogin.class).path(ConsoleLogin.class, "errorOnLoginRedirect").queryParam(OAuth2Constants.ERROR, message).build();
+        URI logout = TokenService.logoutUrl(uriInfo).queryParam(OAuth2Constants.REDIRECT_URI, uri.toString()).build(Config.getAdminRealm());
+        return Response.status(302).location(logout).build();
+    }
+
+    @Path("login-redirect")
+    @GET
+    @NoCache
+    public Response loginRedirect(@QueryParam("code") String code,
+                                  @QueryParam("state") String state,
+                                  @QueryParam("error") String error,
+                                  @QueryParam("path") String path,
+                                  @Context HttpHeaders headers
+
+                                  ) {
+        try {
+            logger.info("loginRedirect ********************** <---");
+            if (error != null) {
+                logger.debug("error from oauth");
+                return redirectOnLoginError(error);
+            }
+            RealmManager realmManager = new RealmManager(session);
+            RealmModel adminRealm = getAdminstrationRealm(realmManager);
+            if (!adminRealm.isEnabled()) {
+                logger.debug("realm not enabled");
+                return redirectOnLoginError("realm not enabled");
+            }
+            ApplicationModel adminConsole = adminRealm.getApplicationNameMap().get(Constants.ADMIN_CONSOLE_APPLICATION);
+            if (!adminConsole.isEnabled()) {
+                logger.debug("admin app not enabled");
+                return redirectOnLoginError("admin app not enabled");
+            }
+
+            if (code == null) {
+                logger.debug("code not specified");
+                return redirectOnLoginError("invalid login data");
+            }
+            if (state == null) {
+                logger.debug("state not specified");
+                return redirectOnLoginError("invalid login data");
+            }
+            new OAuthRedirect().checkStateCookie(uriInfo, headers);
+
+            logger.debug("loginRedirect SUCCESS");
+            NewCookie cookie = authManager.createCookie(adminRealm, adminConsole, code, ConsoleLogin.saasCookiePath(uriInfo).build());
+
+            URI redirectUri = UriBuilder.fromUri(uriInfo.getBaseUri()).path(adminPath).build();
+            if (path != null) {
+                redirectUri = redirectUri.resolve("#" + UriBuilder.fromPath(path).build().toString());
+            }
+            return Response.status(302).cookie(cookie).location(redirectUri).build();
+        } finally {
+            expireCookie();
+        }
+    }
+
+    @Path("logout")
+    @GET
+    @NoCache
+    public Response logout() {
+        RealmManager realmManager = new RealmManager(session);
+        RealmModel realm = getAdminstrationRealm(realmManager);
+        expireCookie();
+        authManager.expireIdentityCookie(realm, uriInfo);
+
+        return Response.status(302).location(uriInfo.getBaseUriBuilder().path(ConsoleLogin.class).path(ConsoleLogin.class, "loginPage").build()).build();
+    }
+
+    @Path("logout-cookie")
+    @GET
+    @NoCache
+    public void logoutCookie() {
+        logger.debug("*** logoutCookie");
+        expireCookie();
+    }
+
+    protected RealmModel getAdminstrationRealm(RealmManager realmManager) {
+        return realmManager.getKeycloakAdminstrationRealm();
+    }
+}
diff --git a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
index 5aab584..970cdff 100755
--- a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
@@ -28,7 +28,7 @@ import javax.ws.rs.core.UriInfo;
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
  */
-@Path("/rest/realms")
+@Path("/realms")
 public class RealmsResource {
     protected static Logger logger = Logger.getLogger(RealmsResource.class);
 
@@ -55,6 +55,9 @@ public class RealmsResource {
     @Context
     protected BruteForceProtector protector;
 
+    @Context
+    protected ResteasyProviderFactory providerFactory;
+
     protected TokenManager tokenManager;
     protected SocialRequestManager socialRequestManager;
 
@@ -67,6 +70,14 @@ public class RealmsResource {
         return uriInfo.getBaseUriBuilder().path(RealmsResource.class).path(RealmsResource.class, "getRealmResource");
     }
 
+    public static UriBuilder realmBaseUrl(UriBuilder base) {
+        return base.path(RealmsResource.class).path(RealmsResource.class, "getRealmResource");
+    }
+
+    public static UriBuilder accountUrl(UriBuilder base) {
+        return base.path(RealmsResource.class).path(RealmsResource.class, "getAccountService");
+    }
+
     @Path("{realm}/tokens")
     public TokenService getTokenService(final @PathParam("realm") String name) {
         RealmManager realmManager = new RealmManager(session);
@@ -116,4 +127,14 @@ public class RealmsResource {
         return realmResource;
     }
 
+    @Path("{realm}/admin/resources")
+    public AdminResource adminResource() {
+        AdminResource adminResource = new AdminResource();
+        ResteasyProviderFactory.getInstance().injectProperties(adminResource);
+        return adminResource;
+
+    }
+
+
+
 }
diff --git a/services/src/main/java/org/keycloak/services/resources/TokenService.java b/services/src/main/java/org/keycloak/services/resources/TokenService.java
index 32cf678..95d8367 100755
--- a/services/src/main/java/org/keycloak/services/resources/TokenService.java
+++ b/services/src/main/java/org/keycloak/services/resources/TokenService.java
@@ -120,36 +120,84 @@ public class TokenService {
     }
 
     public static UriBuilder tokenServiceBaseUrl(UriInfo uriInfo) {
-        UriBuilder base = uriInfo.getBaseUriBuilder().path(RealmsResource.class).path(RealmsResource.class, "getTokenService");
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return tokenServiceBaseUrl(baseUriBuilder);
+    }
+
+    public static UriBuilder tokenServiceBaseUrl(UriBuilder baseUriBuilder) {
+        UriBuilder base = baseUriBuilder.path(RealmsResource.class).path(RealmsResource.class, "getTokenService");
         return base;
     }
 
     public static UriBuilder accessCodeToTokenUrl(UriInfo uriInfo) {
-        return tokenServiceBaseUrl(uriInfo).path(TokenService.class, "accessCodeToToken");
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return accessCodeToTokenUrl(baseUriBuilder);
 
     }
 
+    public static UriBuilder accessCodeToTokenUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = tokenServiceBaseUrl(baseUriBuilder);
+        return uriBuilder.path(TokenService.class, "accessCodeToToken");
+    }
+
     public static UriBuilder grantAccessTokenUrl(UriInfo uriInfo) {
-        return tokenServiceBaseUrl(uriInfo).path(TokenService.class, "grantAccessToken");
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return grantAccessTokenUrl(baseUriBuilder);
 
     }
 
+    public static UriBuilder grantAccessTokenUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = tokenServiceBaseUrl(baseUriBuilder);
+        return uriBuilder.path(TokenService.class, "grantAccessToken");
+    }
+
     public static UriBuilder loginPageUrl(UriInfo uriInfo) {
-        return tokenServiceBaseUrl(uriInfo).path(TokenService.class, "loginPage");
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return loginPageUrl(baseUriBuilder);
+    }
+
+    public static UriBuilder loginPageUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = tokenServiceBaseUrl(baseUriBuilder);
+        return uriBuilder.path(TokenService.class, "loginPage");
     }
 
     public static UriBuilder logoutUrl(UriInfo uriInfo) {
-        return tokenServiceBaseUrl(uriInfo).path(TokenService.class, "logout");
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return logoutUrl(baseUriBuilder);
+    }
+
+    public static UriBuilder logoutUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = tokenServiceBaseUrl(baseUriBuilder);
+        return uriBuilder.path(TokenService.class, "logout");
     }
 
     public static UriBuilder processLoginUrl(UriInfo uriInfo) {
-        return tokenServiceBaseUrl(uriInfo).path(TokenService.class, "processLogin");
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return processLoginUrl(baseUriBuilder);
+    }
+
+    public static UriBuilder processLoginUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = tokenServiceBaseUrl(baseUriBuilder);
+        return uriBuilder.path(TokenService.class, "processLogin");
     }
 
     public static UriBuilder processOAuthUrl(UriInfo uriInfo) {
-        return tokenServiceBaseUrl(uriInfo).path(TokenService.class, "processOAuth");
+        UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
+        return processOAuthUrl(baseUriBuilder);
+    }
+
+    public static UriBuilder processOAuthUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = tokenServiceBaseUrl(baseUriBuilder);
+        return uriBuilder.path(TokenService.class, "processOAuth");
     }
 
+    public static UriBuilder refreshUrl(UriBuilder baseUriBuilder) {
+        UriBuilder uriBuilder = tokenServiceBaseUrl(baseUriBuilder);
+        return uriBuilder.path(TokenService.class, "refreshAccessToken");
+    }
+
+
+
     @Path("grants/access")
     @POST
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java
index 78f82b4..9a7db34 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java
@@ -41,6 +41,7 @@ import org.keycloak.models.UserModel;
 import org.keycloak.models.utils.TimeBasedOTP;
 import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.services.managers.RealmManager;
+import org.keycloak.services.resources.AccountService;
 import org.keycloak.testsuite.AssertEvents;
 import org.keycloak.testsuite.OAuthClient;
 import org.keycloak.testsuite.Retry;
@@ -60,6 +61,7 @@ import org.keycloak.testsuite.rule.WebRule;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 
+import javax.ws.rs.core.UriBuilder;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -90,7 +92,7 @@ public class AccountTest {
         }
     });
 
-    public static String ACCOUNT_REDIRECT = "http://localhost:8081/auth/rest/realms/test/account/login-redirect";
+    public static String ACCOUNT_REDIRECT = AccountService.accountServiceBaseUrl(UriBuilder.fromUri("http://localhost:8081/auth")).build("test").toString();
 
     @Rule
     public AssertEvents events = new AssertEvents(keycloakRule);
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/ProfileTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/ProfileTest.java
index 59cbd00..73de4a7 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/ProfileTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/ProfileTest.java
@@ -19,6 +19,7 @@ import org.keycloak.models.UserCredentialModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.services.managers.RealmManager;
+import org.keycloak.services.resources.RealmsResource;
 import org.keycloak.testsuite.Constants;
 import org.keycloak.testsuite.OAuthClient;
 import org.keycloak.testsuite.pages.AccountUpdateProfilePage;
@@ -201,7 +202,7 @@ public class ProfileTest {
     }
 
     private URI getAccountURI() {
-        return UriBuilder.fromUri(Constants.AUTH_SERVER_ROOT + "/rest/realms/" + oauth.getRealm() + "/account").build();
+        return RealmsResource.accountUrl(UriBuilder.fromUri(Constants.AUTH_SERVER_ROOT)).build(oauth.getRealm());
     }
 
     private HttpResponse doGetProfile(String token, String origin) throws IOException {
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/actions/RequiredActionTotpSetupTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/actions/RequiredActionTotpSetupTest.java
index d9e13c9..ec4cbb2 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/actions/RequiredActionTotpSetupTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/actions/RequiredActionTotpSetupTest.java
@@ -30,6 +30,7 @@ import org.keycloak.models.RealmModel;
 import org.keycloak.models.utils.TimeBasedOTP;
 import org.keycloak.representations.idm.CredentialRepresentation;
 import org.keycloak.services.managers.RealmManager;
+import org.keycloak.services.resources.AccountService;
 import org.keycloak.testsuite.AssertEvents;
 import org.keycloak.testsuite.OAuthClient;
 import org.keycloak.testsuite.pages.AccountTotpPage;
@@ -45,6 +46,8 @@ import org.keycloak.testsuite.rule.WebResource;
 import org.keycloak.testsuite.rule.WebRule;
 import org.openqa.selenium.WebDriver;
 
+import javax.ws.rs.core.UriBuilder;
+
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
@@ -186,7 +189,7 @@ public class RequiredActionTotpSetupTest {
         accountTotpPage.assertCurrent();
 
         events.expectLogin().user(userId).detail(Details.AUTH_METHOD, "sso").client("account")
-                .detail(Details.REDIRECT_URI, "http://localhost:8081/auth/rest/realms/test/account/login-redirect?path=totp")
+                .detail(Details.REDIRECT_URI, AccountService.loginRedirectUrl(UriBuilder.fromUri("http://localhost:8081/auth")).queryParam("path", "totp").build("test").toString())
                 .removeDetail(Details.USERNAME).assertEvent();
 
         // Remove google authentificator
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/AdapterTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/AdapterTest.java
index 3323d77..8fde46f 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/AdapterTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/AdapterTest.java
@@ -35,6 +35,7 @@ import org.keycloak.representations.adapters.action.SessionStats;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.managers.TokenManager;
+import org.keycloak.services.resources.TokenService;
 import org.keycloak.testsuite.OAuthClient;
 import org.keycloak.testsuite.pages.LoginPage;
 import org.keycloak.testsuite.rule.AbstractKeycloakRule;
@@ -60,7 +61,7 @@ import java.util.Map;
  */
 public class AdapterTest {
 
-    public static final String LOGIN_URL = "http://localhost:8081/auth/rest/realms/demo/tokens/login";
+    public static final String LOGIN_URL = TokenService.loginPageUrl(UriBuilder.fromUri("http://localhost:8081/auth")).build("demo").toString();
     public static PublicKey realmPublicKey;
     @ClassRule
     public static AbstractKeycloakRule keycloakRule = new AbstractKeycloakRule(){
@@ -139,8 +140,8 @@ public class AdapterTest {
 
         // test logout
 
-        String logoutUri = UriBuilder.fromUri("http://localhost:8081/auth/rest/realms/demo/tokens/logout")
-                .queryParam(OAuth2Constants.REDIRECT_URI, "http://localhost:8081/customer-portal").build().toString();
+        String logoutUri = TokenService.logoutUrl(UriBuilder.fromUri("http://localhost:8081/auth"))
+                .queryParam(OAuth2Constants.REDIRECT_URI, "http://localhost:8081/customer-portal").build("demo").toString();
         driver.navigate().to(logoutUri);
         Assert.assertTrue(driver.getCurrentUrl().startsWith(LOGIN_URL));
         driver.navigate().to("http://localhost:8081/product-portal");
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/RelativeUriAdapterTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/RelativeUriAdapterTest.java
index 6ac6ff6..1c9b1fe 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/RelativeUriAdapterTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/adapter/RelativeUriAdapterTest.java
@@ -35,6 +35,7 @@ import org.keycloak.representations.adapters.action.SessionStats;
 import org.keycloak.representations.idm.RealmRepresentation;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.managers.TokenManager;
+import org.keycloak.services.resources.TokenService;
 import org.keycloak.testsuite.OAuthClient;
 import org.keycloak.testsuite.pages.LoginPage;
 import org.keycloak.testsuite.rule.AbstractKeycloakRule;
@@ -63,7 +64,7 @@ import java.util.Map;
  */
 public class RelativeUriAdapterTest {
 
-    public static final String LOGIN_URL = "http://localhost:8081/auth/rest/realms/demo/tokens/login";
+    public static final String LOGIN_URL = TokenService.loginPageUrl(UriBuilder.fromUri("http://localhost:8081/auth")).build("demo").toString();
     public static PublicKey realmPublicKey;
     @ClassRule
     public static AbstractKeycloakRule keycloakRule = new AbstractKeycloakRule(){
@@ -142,8 +143,8 @@ public class RelativeUriAdapterTest {
 
         // test logout
 
-        String logoutUri = UriBuilder.fromUri("http://localhost:8081/auth/rest/realms/demo/tokens/logout")
-                .queryParam(OAuth2Constants.REDIRECT_URI, "http://localhost:8081/customer-portal").build().toString();
+        String logoutUri = TokenService.logoutUrl(UriBuilder.fromUri("http://localhost:8081/auth"))
+                .queryParam(OAuth2Constants.REDIRECT_URI, "http://localhost:8081/customer-portal").build("demo").toString();
         driver.navigate().to(logoutUri);
         Assert.assertTrue(driver.getCurrentUrl().startsWith(LOGIN_URL));
         driver.navigate().to("http://localhost:8081/product-portal");
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/ApplicationServlet.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/ApplicationServlet.java
index ab6e3b3..b40cda7 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/ApplicationServlet.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/ApplicationServlet.java
@@ -21,10 +21,13 @@
  */
 package org.keycloak.testsuite;
 
+import org.keycloak.services.resources.RealmsResource;
+
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.UriBuilder;
 import java.io.IOException;
 import java.io.PrintWriter;
 
@@ -48,8 +51,8 @@ public class ApplicationServlet extends HttpServlet {
 
         PrintWriter pw = resp.getWriter();
         pw.printf("<html><head><title>%s</title></head><body>", title);
-
-        pw.printf(LINK, "http://localhost:8081/auth/rest/realms/test/account", "account", "account");
+        UriBuilder base = UriBuilder.fromUri("http://localhost:8081/auth");
+        pw.printf(LINK, RealmsResource.accountUrl(base), "account", "account");
 
         pw.print("</body></html>");
         pw.flush();
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/SSOTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/SSOTest.java
old mode 100644
new mode 100755
index c02794e..3dac594
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/SSOTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/SSOTest.java
@@ -27,6 +27,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.keycloak.OAuth2Constants;
 import org.keycloak.audit.Details;
+import org.keycloak.services.resources.AccountService;
 import org.keycloak.testsuite.AssertEvents;
 import org.keycloak.testsuite.OAuthClient;
 import org.keycloak.testsuite.pages.AccountUpdateProfilePage;
@@ -38,6 +39,8 @@ import org.keycloak.testsuite.rule.WebResource;
 import org.keycloak.testsuite.rule.WebRule;
 import org.openqa.selenium.WebDriver;
 
+import javax.ws.rs.core.UriBuilder;
+
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
@@ -89,7 +92,7 @@ public class SSOTest {
         Assert.assertTrue(profilePage.isCurrent());
 
         events.expectLogin().detail(Details.AUTH_METHOD, "sso").removeDetail(Details.USERNAME).client("test-app").assertEvent();
-        events.expectLogin().detail(Details.AUTH_METHOD, "sso").removeDetail(Details.USERNAME).client("account").detail(Details.REDIRECT_URI, "http://localhost:8081/auth/rest/realms/test/account/login-redirect").assertEvent();
+        events.expectLogin().detail(Details.AUTH_METHOD, "sso").removeDetail(Details.USERNAME).client("account").detail(Details.REDIRECT_URI, AccountService.loginRedirectUrl(UriBuilder.fromUri("http://localhost:8081/auth")).build("rest").toString()).assertEvent();
     }
 
 }
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/OAuthClient.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/OAuthClient.java
index d0119d4..2b8ea8f 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/OAuthClient.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/OAuthClient.java
@@ -40,6 +40,7 @@ import org.keycloak.jose.jws.JWSInput;
 import org.keycloak.jose.jws.crypto.RSAProvider;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.representations.RefreshToken;
+import org.keycloak.services.resources.TokenService;
 import org.keycloak.util.BasicAuthHelper;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
@@ -61,7 +62,7 @@ public class OAuthClient {
 
     private WebDriver driver;
 
-    private String baseUrl = Constants.AUTH_SERVER_ROOT + "/rest";
+    private String baseUrl = Constants.AUTH_SERVER_ROOT;
 
     private String realm = "test";
 
@@ -233,11 +234,11 @@ public class OAuthClient {
     }
 
     public void openLogout() {
-        UriBuilder b = UriBuilder.fromUri(baseUrl + "/realms/" + realm + "/tokens/logout");
+        UriBuilder b = TokenService.logoutUrl(UriBuilder.fromUri(baseUrl));
         if (redirectUri != null) {
             b.queryParam(OAuth2Constants.REDIRECT_URI, redirectUri);
         }
-        driver.navigate().to(b.build().toString());
+        driver.navigate().to(b.build(realm).toString());
     }
 
     public String getRedirectUri() {
@@ -245,7 +246,7 @@ public class OAuthClient {
     }
 
     public String getLoginFormUrl() {
-        UriBuilder b = UriBuilder.fromUri(baseUrl + "/realms/" + realm + "/tokens/login");
+        UriBuilder b = TokenService.loginPageUrl(UriBuilder.fromUri(baseUrl));
         if (responseType != null) {
             b.queryParam(OAuth2Constants.RESPONSE_TYPE, responseType);
         }
@@ -258,17 +259,17 @@ public class OAuthClient {
         if (state != null) {
             b.queryParam(OAuth2Constants.STATE, state);
         }
-        return b.build().toString();
+        return b.build(realm).toString();
     }
 
     public String getAccessTokenUrl() {
-        UriBuilder b = UriBuilder.fromUri(baseUrl + "/realms/" + realm + "/tokens/access/codes");
-        return b.build().toString();
+        UriBuilder b = TokenService.accessCodeToTokenUrl(UriBuilder.fromUri(baseUrl));
+        return b.build(realm).toString();
     }
 
     public String getRefreshTokenUrl() {
-        UriBuilder b = UriBuilder.fromUri(baseUrl + "/realms/" + realm + "/tokens/refresh");
-        return b.build().toString();
+        UriBuilder b = TokenService.refreshUrl(UriBuilder.fromUri(baseUrl));
+        return b.build(realm).toString();
     }
 
     public OAuthClient realm(String realm) {
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountLogPage.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountLogPage.java
old mode 100644
new mode 100755
index 1f796d0..ab85433
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountLogPage.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountLogPage.java
@@ -21,11 +21,13 @@
  */
 package org.keycloak.testsuite.pages;
 
+import org.keycloak.services.resources.AccountService;
 import org.keycloak.testsuite.Constants;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.FindBy;
 
+import javax.ws.rs.core.UriBuilder;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -34,7 +36,7 @@ import java.util.List;
  */
 public class AccountLogPage extends AbstractAccountPage {
 
-    private static String PATH = Constants.AUTH_SERVER_ROOT + "/rest/realms/test/account/log";
+    private static String PATH = AccountService.logUrl(UriBuilder.fromUri(Constants.AUTH_SERVER_ROOT)).build("test").toString();
 
     public boolean isCurrent() {
         return driver.getTitle().contains("Account Management") && driver.getCurrentUrl().endsWith("/account/log");
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountPasswordPage.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountPasswordPage.java
old mode 100644
new mode 100755
index 8b287c4..d621c71
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountPasswordPage.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountPasswordPage.java
@@ -21,16 +21,19 @@
  */
 package org.keycloak.testsuite.pages;
 
+import org.keycloak.services.resources.AccountService;
 import org.keycloak.testsuite.Constants;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.FindBy;
 
+import javax.ws.rs.core.UriBuilder;
+
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
 public class AccountPasswordPage extends AbstractAccountPage {
 
-    private static String PATH = Constants.AUTH_SERVER_ROOT + "/rest/realms/test/account/password";
+    private static String PATH = AccountService.passwordUrl(UriBuilder.fromUri(Constants.AUTH_SERVER_ROOT)).build("test").toString();
 
     @FindBy(id = "password")
     private WebElement passwordInput;
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountTotpPage.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountTotpPage.java
old mode 100644
new mode 100755
index cd454de..99716a2
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountTotpPage.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountTotpPage.java
@@ -21,16 +21,19 @@
  */
 package org.keycloak.testsuite.pages;
 
+import org.keycloak.services.resources.AccountService;
 import org.keycloak.testsuite.Constants;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.FindBy;
 
+import javax.ws.rs.core.UriBuilder;
+
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
 public class AccountTotpPage extends AbstractAccountPage {
 
-    private static String PATH = Constants.AUTH_SERVER_ROOT + "/rest/realms/test/account/totp";
+    private static String PATH = AccountService.totpUrl(UriBuilder.fromUri(Constants.AUTH_SERVER_ROOT)).build("test").toString();
 
     @FindBy(id = "totpSecret")
     private WebElement totpSecret;
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountUpdateProfilePage.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountUpdateProfilePage.java
old mode 100644
new mode 100755
index 04f1c60..a869dcf
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountUpdateProfilePage.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountUpdateProfilePage.java
@@ -21,16 +21,20 @@
  */
 package org.keycloak.testsuite.pages;
 
+import org.keycloak.services.resources.AccountService;
+import org.keycloak.services.resources.RealmsResource;
 import org.keycloak.testsuite.Constants;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.FindBy;
 
+import javax.ws.rs.core.UriBuilder;
+
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
 public class AccountUpdateProfilePage extends AbstractAccountPage {
 
-    public static String PATH = Constants.AUTH_SERVER_ROOT + "/rest/realms/test/account";
+    public static String PATH = RealmsResource.accountUrl(UriBuilder.fromUri(Constants.AUTH_SERVER_ROOT)).build("test").toString();
 
     @FindBy(id = "firstName")
     private WebElement firstNameInput;