diff --git a/integration/js/src/main/resources/META-INF/resources/js/keycloak.js b/integration/js/src/main/resources/META-INF/resources/js/keycloak.js
index 821d0e196b0..11da6c8faad 100755
--- a/integration/js/src/main/resources/META-INF/resources/js/keycloak.js
+++ b/integration/js/src/main/resources/META-INF/resources/js/keycloak.js
@@ -103,10 +103,11 @@ var Keycloak = function (config) {
return url;
}
- kc.createAccountUrl = function() {
+ kc.createAccountUrl = function(options) {
var url = getRealmUrl()
+ '/account'
- + '?referrer=' + kc.clientId;
+ + '?referrer=' + kc.clientId
+ + '&referrer_uri=' + encodeURIComponent(adapter.redirectUri(options));
return url;
}
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 593f3d3e871..eb53402709d 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -99,7 +99,7 @@ public class AccountService {
Account account = AccountLoader.load().createAccount(uriInfo).setRealm(realm).setUser(auth.getUser());
- String referrer = getReferrer();
+ String[] referrer = getReferrer();
if (referrer != null) {
account.setReferrer(referrer);
}
@@ -377,13 +377,17 @@ public class AccountService {
uriBuilder.queryParam("path", path);
}
- String referrer = getReferrer();
+ String referrer = uriInfo.getQueryParameters().getFirst("referrer");
if (referrer != null) {
uriBuilder.queryParam("referrer", referrer);
}
- URI accountUri = uriBuilder.build(realm.getName());
+ String referrerUri = uriInfo.getQueryParameters().getFirst("referrer_uri");
+ if (referrerUri != null) {
+ uriBuilder.queryParam("referrer_uri", referrerUri);
+ }
+ URI accountUri = uriBuilder.build(realm.getName());
oauth.setStateCookiePath(accountUri.getRawPath());
return oauth.redirect(uriInfo, accountUri.toString());
@@ -397,20 +401,34 @@ public class AccountService {
return auth;
}
- private String getReferrer() {
+ private String[] getReferrer() {
String referrer = uriInfo.getQueryParameters().getFirst("referrer");
- if (referrer != null) {
- return referrer;
+ if (referrer == null) {
+ return null;
}
- String referrerUrl = headers.getHeaderString("Referer");
- if (referrerUrl != null) {
- for (ApplicationModel a : realm.getApplications()) {
- if (a.getBaseUrl() != null && referrerUrl.startsWith(a.getBaseUrl())) {
- return a.getName();
+ String referrerUri = uriInfo.getQueryParameters().getFirst("referrer_uri");
+
+ ApplicationModel application = realm.getApplicationByName(referrer);
+ if (application != null) {
+ if (referrerUri != null) {
+ referrerUri = TokenService.verifyRedirectUri(referrerUri, application);
+ } else {
+ referrerUri = application.getBaseUrl();
+ }
+
+ if (referrerUri != null) {
+ return new String[] { referrer, referrerUri };
+ }
+ } else if (referrerUri != null) {
+ ClientModel client = realm.getOAuthClient(referrer);
+ if (client != null) {
+ referrerUri = TokenService.verifyRedirectUri(referrerUri, application);
+
+ if (referrerUri != null) {
+ return new String[] { referrer, referrerUri };
}
}
- return null;
}
return null;
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/AccountTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/AccountTest.java
index 0aa9075a339..27e013b6462 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/AccountTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/AccountTest.java
@@ -107,19 +107,7 @@ public class AccountTest {
});
}
- //@Test
- public void returnToAppFromHeader() {
- appPage.open();
- appPage.openAccount();
- loginPage.login("test-user@localhost", "password");
-
- Assert.assertTrue(profilePage.isCurrent());
- profilePage.backToApplication();
-
- Assert.assertTrue(appPage.isCurrent());
- }
-
- //@Test
+ @Test
public void returnToAppFromQueryParam() {
driver.navigate().to(AccountUpdateProfilePage.PATH + "?referrer=test-app");
loginPage.login("test-user@localhost", "password");
@@ -127,6 +115,13 @@ public class AccountTest {
profilePage.backToApplication();
Assert.assertTrue(appPage.isCurrent());
+
+ driver.navigate().to(AccountUpdateProfilePage.PATH + "?referrer=test-app&referrer_uri=http://localhost:8081/app?test");
+ Assert.assertTrue(profilePage.isCurrent());
+ profilePage.backToApplication();
+
+ Assert.assertTrue(appPage.isCurrent());
+ Assert.assertEquals(appPage.baseUrl + "?test", driver.getCurrentUrl());
}
@Test
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
index 3f9c7844fa3..582c1120d9d 100644
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountUpdateProfilePage.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AccountUpdateProfilePage.java
@@ -42,7 +42,7 @@ public class AccountUpdateProfilePage extends AbstractAccountPage {
private WebElement emailInput;
- @FindBy(linkText = "Back to application")
+ @FindBy(id = "referrer")
private WebElement backToApplicationLink;
@FindBy(css = "button[type=\"submit\"]")
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AppPage.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AppPage.java
index c0ce1397a40..7fa6c9e44ad 100644
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AppPage.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/AppPage.java
@@ -30,7 +30,7 @@ import org.openqa.selenium.support.FindBy;
*/
public class AppPage extends AbstractPage {
- private String baseUrl = "http://localhost:8081/app";
+ public static final String baseUrl = "http://localhost:8081/app";
@FindBy(id = "account")
private WebElement accountLink;