Added support for any port with http://localhost redirect uri
This commit is contained in:
parent
34260b7428
commit
0219aa1e4c
4 changed files with 78 additions and 6 deletions
|
@ -13,4 +13,5 @@ public interface Constants {
|
||||||
String ACCOUNT_MANAGEMENT_APP = "account";
|
String ACCOUNT_MANAGEMENT_APP = "account";
|
||||||
|
|
||||||
String INSTALLED_APP_URN = "urn:ietf:wg:oauth:2.0:oob";
|
String INSTALLED_APP_URN = "urn:ietf:wg:oauth:2.0:oob";
|
||||||
|
String INSTALLED_APP_URL = "http://localhost";
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import org.keycloak.OAuthErrorException;
|
||||||
import org.keycloak.jose.jws.JWSInput;
|
import org.keycloak.jose.jws.JWSInput;
|
||||||
import org.keycloak.jose.jws.crypto.RSAProvider;
|
import org.keycloak.jose.jws.crypto.RSAProvider;
|
||||||
import org.keycloak.models.ClientModel;
|
import org.keycloak.models.ClientModel;
|
||||||
|
import org.keycloak.models.Constants;
|
||||||
import org.keycloak.models.KeycloakSession;
|
import org.keycloak.models.KeycloakSession;
|
||||||
import org.keycloak.models.KeycloakTransaction;
|
import org.keycloak.models.KeycloakTransaction;
|
||||||
import org.keycloak.models.RealmModel;
|
import org.keycloak.models.RealmModel;
|
||||||
|
@ -619,7 +620,26 @@ public class TokenService {
|
||||||
return redirectUri;
|
return redirectUri;
|
||||||
} else {
|
} else {
|
||||||
String r = redirectUri.indexOf('?') != -1 ? redirectUri.substring(0, redirectUri.indexOf('?')) : redirectUri;
|
String r = redirectUri.indexOf('?') != -1 ? redirectUri.substring(0, redirectUri.indexOf('?')) : redirectUri;
|
||||||
return client.getRedirectUris().contains(r) ? redirectUri : null;
|
|
||||||
|
boolean valid = client.getRedirectUris().contains(r);
|
||||||
|
|
||||||
|
if (!valid && r.startsWith(Constants.INSTALLED_APP_URL) && r.indexOf(':', Constants.INSTALLED_APP_URL.length()) >= 0) {
|
||||||
|
int i = r.indexOf(':', Constants.INSTALLED_APP_URL.length());
|
||||||
|
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(r.substring(0, i));
|
||||||
|
|
||||||
|
i = r.indexOf('/', i);
|
||||||
|
if (i >= 0) {
|
||||||
|
sb.append(r.substring(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
r = sb.toString();
|
||||||
|
|
||||||
|
valid = client.getRedirectUris().contains(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
return valid ? redirectUri : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,11 +96,7 @@ public class AuthorizationCodeTest {
|
||||||
keycloakRule.configure(new KeycloakRule.KeycloakSetup() {
|
keycloakRule.configure(new KeycloakRule.KeycloakSetup() {
|
||||||
@Override
|
@Override
|
||||||
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
||||||
for (ApplicationModel app : appRealm.getApplications()) {
|
appRealm.getApplicationByName("test-app").addRedirectUri(oauth.getRedirectUri());
|
||||||
if (app.getName().equals("test-app")) {
|
|
||||||
app.addRedirectUri(oauth.getRedirectUri());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.junit.ClassRule;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.keycloak.models.ApplicationModel;
|
import org.keycloak.models.ApplicationModel;
|
||||||
|
import org.keycloak.models.Constants;
|
||||||
import org.keycloak.models.RealmModel;
|
import org.keycloak.models.RealmModel;
|
||||||
import org.keycloak.services.managers.RealmManager;
|
import org.keycloak.services.managers.RealmManager;
|
||||||
import org.keycloak.testsuite.OAuthClient;
|
import org.keycloak.testsuite.OAuthClient;
|
||||||
|
@ -49,6 +50,15 @@ public class OAuthRedirectUriTest {
|
||||||
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
||||||
ApplicationModel app = appRealm.getApplicationNameMap().get("test-app");
|
ApplicationModel app = appRealm.getApplicationNameMap().get("test-app");
|
||||||
app.addRedirectUri("http://localhost:8081/app");
|
app.addRedirectUri("http://localhost:8081/app");
|
||||||
|
|
||||||
|
ApplicationModel installedApp = appRealm.addApplication("test-installed");
|
||||||
|
installedApp.setEnabled(true);
|
||||||
|
installedApp.addRedirectUri(Constants.INSTALLED_APP_URN);
|
||||||
|
installedApp.addRedirectUri(Constants.INSTALLED_APP_URL);
|
||||||
|
|
||||||
|
ApplicationModel installedApp2 = appRealm.addApplication("test-installed2");
|
||||||
|
installedApp2.setEnabled(true);
|
||||||
|
installedApp2.addRedirectUri(Constants.INSTALLED_APP_URL + "/myapp");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -150,6 +160,15 @@ public class OAuthRedirectUriTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testValid() throws IOException {
|
||||||
|
oauth.redirectUri("http://localhost:8081/app");
|
||||||
|
OAuthClient.AuthorizationCodeResponse response = oauth.doLogin("test-user@localhost", "password");
|
||||||
|
|
||||||
|
Assert.assertNotNull(response.getCode());
|
||||||
|
Assert.assertTrue(driver.getCurrentUrl().startsWith("http://localhost:8081/app?code="));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testInvalid() throws IOException {
|
public void testInvalid() throws IOException {
|
||||||
oauth.redirectUri("http://localhost:8081/app2");
|
oauth.redirectUri("http://localhost:8081/app2");
|
||||||
|
@ -168,4 +187,40 @@ public class OAuthRedirectUriTest {
|
||||||
Assert.assertTrue(driver.getCurrentUrl().startsWith("http://localhost:8081/app?key=value&code="));
|
Assert.assertTrue(driver.getCurrentUrl().startsWith("http://localhost:8081/app?key=value&code="));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLocalhost() throws IOException {
|
||||||
|
oauth.clientId("test-installed");
|
||||||
|
|
||||||
|
checkRedirectUri("urn:ietf:wg:oauth:2.0:oob", true);
|
||||||
|
checkRedirectUri("http://localhost", true);
|
||||||
|
|
||||||
|
checkRedirectUri("http://localhost:8081", true);
|
||||||
|
|
||||||
|
checkRedirectUri("http://localhosts", false);
|
||||||
|
checkRedirectUri("http://localhost/myapp", false);
|
||||||
|
checkRedirectUri("http://localhost:8081/myapp", false);
|
||||||
|
|
||||||
|
oauth.clientId("test-installed2");
|
||||||
|
|
||||||
|
checkRedirectUri("http://localhost/myapp", true);
|
||||||
|
checkRedirectUri("http://localhost:8081/myapp", true);
|
||||||
|
|
||||||
|
checkRedirectUri("http://localhosts/myapp", false);
|
||||||
|
checkRedirectUri("http://localhost", false);
|
||||||
|
checkRedirectUri("http://localhost/myapp2", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkRedirectUri(String redirectUri, boolean expectValid) {
|
||||||
|
oauth.redirectUri(redirectUri);
|
||||||
|
oauth.openLoginForm();
|
||||||
|
|
||||||
|
if (expectValid) {
|
||||||
|
Assert.assertTrue(loginPage.isCurrent());
|
||||||
|
} else {
|
||||||
|
Assert.assertTrue(errorPage.isCurrent());
|
||||||
|
Assert.assertEquals("Invalid redirect_uri.", errorPage.getError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue