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 926cb39..d2e0e3d 100755
--- a/services/src/main/java/org/keycloak/services/resources/TokenService.java
+++ b/services/src/main/java/org/keycloak/services/resources/TokenService.java
@@ -2,6 +2,7 @@ package org.keycloak.services.resources;
import org.jboss.logging.Logger;
import org.jboss.resteasy.annotations.cache.NoCache;
+import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
import org.jboss.resteasy.spi.BadRequestException;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.HttpResponse;
@@ -789,7 +790,8 @@ public class TokenService {
@GET
public Response loginPage(final @QueryParam("response_type") String responseType,
@QueryParam("redirect_uri") String redirect, final @QueryParam("client_id") String clientId,
- final @QueryParam("scope") String scopeParam, final @QueryParam("state") String state, final @QueryParam("prompt") String prompt) {
+ final @QueryParam("scope") String scopeParam, final @QueryParam("state") String state, final @QueryParam("prompt") String prompt,
+ final @QueryParam("login_hint") String loginHint) {
logger.info("TokenService.loginPage");
audit.event(EventType.LOGIN).client(clientId).detail(Details.REDIRECT_URI, redirect).detail(Details.RESPONSE_TYPE, "code");
@@ -845,8 +847,17 @@ public class TokenService {
if (prompt != null && prompt.equals("none")) {
return oauth.redirectError(client, "access_denied", state, redirect);
}
- logger.info("createLogin() now...");
- return Flows.forms(session, realm, uriInfo).createLogin();
+
+ LoginFormsProvider forms = Flows.forms(session, realm, uriInfo);
+
+ if (loginHint != null) {
+ MultivaluedMap<String, String> formData = new MultivaluedMapImpl<String, String>();
+ formData.add(AuthenticationManager.FORM_USERNAME, loginHint);
+
+ forms.setFormData(formData);
+ }
+
+ return forms.createLogin();
}
/**
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/LoginTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/LoginTest.java
index ad0a4c1..c406bfb 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/LoginTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/LoginTest.java
@@ -121,6 +121,20 @@ public class LoginTest {
}
@Test
+ public void loginLoginHint() {
+ String loginFormUrl = oauth.getLoginFormUrl() + "&login_hint=login-test";
+ driver.navigate().to(loginFormUrl);
+
+ Assert.assertEquals("login-test", loginPage.getUsername());
+ loginPage.login("password");
+
+ Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
+ Assert.assertNotNull(oauth.getCurrentQuery().get(OAuth2Constants.CODE));
+
+ events.expectLogin().user(userId).detail(Details.USERNAME, "login-test").assertEvent();
+ }
+
+ @Test
public void loginWithEmailSuccess() {
loginPage.open();
loginPage.login("login@test.com", "password");
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginPage.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginPage.java
index a266b8a..25e36a8 100644
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginPage.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/pages/LoginPage.java
@@ -75,6 +75,17 @@ public class LoginPage extends AbstractPage {
submitButton.click();
}
+ public void login(String password) {
+ passwordInput.clear();
+ passwordInput.sendKeys(password);
+
+ submitButton.click();
+ }
+
+ public String getUsername() {
+ return usernameInput.getAttribute("value");
+ }
+
public void cancel() {
cancelButton.click();
}