KEYCLOAK-1074
- field label changes on login page - added all relevant integration tests
This commit is contained in:
parent
f64da6faa0
commit
aad1f3707e
9 changed files with 243 additions and 9 deletions
|
@ -17,7 +17,7 @@
|
||||||
<form id="kc-form-login" class="${properties.kcFormClass!}" action="${url.loginAction}" method="post">
|
<form id="kc-form-login" class="${properties.kcFormClass!}" action="${url.loginAction}" method="post">
|
||||||
<div class="${properties.kcFormGroupClass!}">
|
<div class="${properties.kcFormGroupClass!}">
|
||||||
<div class="${properties.kcLabelWrapperClass!}">
|
<div class="${properties.kcLabelWrapperClass!}">
|
||||||
<label for="username" class="${properties.kcLabelClass!}">${rb.usernameOrEmail}</label>
|
<label for="username" class="${properties.kcLabelClass!}"><#if !realm.registrationEmailAsUsername>${rb.usernameOrEmail}<#else>${rb.email}</#if></label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="${properties.kcInputWrapperClass!}">
|
<div class="${properties.kcInputWrapperClass!}">
|
||||||
|
|
|
@ -541,12 +541,15 @@ public class IdentityBrokerService {
|
||||||
String username = updatedIdentity.getUsername();
|
String username = updatedIdentity.getUsername();
|
||||||
if (this.realmModel.isRegistrationEmailAsUsername()) {
|
if (this.realmModel.isRegistrationEmailAsUsername()) {
|
||||||
username = updatedIdentity.getEmail();
|
username = updatedIdentity.getEmail();
|
||||||
if (username == null) {
|
if (username == null || username.trim().length() == 0) {
|
||||||
fireErrorEvent(Errors.FEDERATED_IDENTITY_REGISTRATION_EMAIL_MISSING);
|
fireErrorEvent(Errors.FEDERATED_IDENTITY_REGISTRATION_EMAIL_MISSING);
|
||||||
throw new IdentityBrokerException("federatedIdentityRegistrationEmailMissing");
|
throw new IdentityBrokerException("federatedIdentityRegistrationEmailMissing");
|
||||||
// TODO KEYCLOAK-1053 (ask user to enter email address) should be implemented instead of plain exception as
|
// TODO KEYCLOAK-1053 (ask user to enter email address) should be implemented instead of plain exception as
|
||||||
// better solution for this case
|
// better solution for this case
|
||||||
}
|
}
|
||||||
|
username = username.trim();
|
||||||
|
} else if (username != null) {
|
||||||
|
username = username.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
existingUser = this.session.users().getUserByUsername(username, this.realmModel);
|
existingUser = this.session.users().getUserByUsername(username, this.realmModel);
|
||||||
|
|
|
@ -60,10 +60,13 @@ public class RealmTest extends AbstractClientTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void updateRealm() {
|
public void updateRealm() {
|
||||||
|
// first change
|
||||||
RealmRepresentation rep = realm.toRepresentation();
|
RealmRepresentation rep = realm.toRepresentation();
|
||||||
rep.setSsoSessionIdleTimeout(123);
|
rep.setSsoSessionIdleTimeout(123);
|
||||||
rep.setSsoSessionMaxLifespan(12);
|
rep.setSsoSessionMaxLifespan(12);
|
||||||
rep.setAccessCodeLifespanLogin(1234);
|
rep.setAccessCodeLifespanLogin(1234);
|
||||||
|
rep.setRegistrationAllowed(true);
|
||||||
|
rep.setRegistrationEmailAsUsername(true);
|
||||||
|
|
||||||
realm.update(rep);
|
realm.update(rep);
|
||||||
|
|
||||||
|
@ -72,6 +75,18 @@ public class RealmTest extends AbstractClientTest {
|
||||||
assertEquals(123, rep.getSsoSessionIdleTimeout().intValue());
|
assertEquals(123, rep.getSsoSessionIdleTimeout().intValue());
|
||||||
assertEquals(12, rep.getSsoSessionMaxLifespan().intValue());
|
assertEquals(12, rep.getSsoSessionMaxLifespan().intValue());
|
||||||
assertEquals(1234, rep.getAccessCodeLifespanLogin().intValue());
|
assertEquals(1234, rep.getAccessCodeLifespanLogin().intValue());
|
||||||
|
assertEquals(Boolean.TRUE, rep.isRegistrationAllowed());
|
||||||
|
assertEquals(Boolean.TRUE, rep.isRegistrationEmailAsUsername());
|
||||||
|
|
||||||
|
// second change
|
||||||
|
rep.setRegistrationAllowed(false);
|
||||||
|
rep.setRegistrationEmailAsUsername(false);
|
||||||
|
|
||||||
|
realm.update(rep);
|
||||||
|
|
||||||
|
rep = realm.toRepresentation();
|
||||||
|
assertEquals(Boolean.FALSE, rep.isRegistrationAllowed());
|
||||||
|
assertEquals(Boolean.FALSE, rep.isRegistrationEmailAsUsername());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -59,6 +59,7 @@ import javax.ws.rs.core.HttpHeaders;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
import javax.ws.rs.core.Response.Status;
|
import javax.ws.rs.core.Response.Status;
|
||||||
import javax.ws.rs.core.UriBuilder;
|
import javax.ws.rs.core.UriBuilder;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -68,6 +69,7 @@ import static com.thoughtworks.selenium.SeleneseTestBase.fail;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -124,7 +126,7 @@ public abstract class AbstractIdentityProviderTest {
|
||||||
public void testSuccessfulAuthentication() {
|
public void testSuccessfulAuthentication() {
|
||||||
IdentityProviderModel identityProviderModel = getIdentityProviderModel();
|
IdentityProviderModel identityProviderModel = getIdentityProviderModel();
|
||||||
|
|
||||||
assertSuccessfulAuthentication(identityProviderModel);
|
assertSuccessfulAuthentication(identityProviderModel, "test-user");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -132,7 +134,77 @@ public abstract class AbstractIdentityProviderTest {
|
||||||
IdentityProviderModel identityProviderModel = getIdentityProviderModel();
|
IdentityProviderModel identityProviderModel = getIdentityProviderModel();
|
||||||
identityProviderModel.setUpdateProfileFirstLogin(false);
|
identityProviderModel.setUpdateProfileFirstLogin(false);
|
||||||
|
|
||||||
assertSuccessfulAuthentication(identityProviderModel);
|
assertSuccessfulAuthentication(identityProviderModel, "test-user");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSuccessfulAuthenticationWithoutUpdateProfile_newUser_emailAsUsername() {
|
||||||
|
|
||||||
|
getRealm().setRegistrationEmailAsUsername(true);
|
||||||
|
brokerServerRule.stopSession(this.session, true);
|
||||||
|
this.session = brokerServerRule.startSession();
|
||||||
|
|
||||||
|
try {
|
||||||
|
IdentityProviderModel identityProviderModel = getIdentityProviderModel();
|
||||||
|
identityProviderModel.setUpdateProfileFirstLogin(false);
|
||||||
|
|
||||||
|
authenticateWithIdentityProvider(identityProviderModel, "test-user");
|
||||||
|
|
||||||
|
// authenticated and redirected to app
|
||||||
|
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8081/test-app"));
|
||||||
|
|
||||||
|
// check correct user is created with email as username and bound to correct federated identity
|
||||||
|
RealmModel realm = getRealm();
|
||||||
|
|
||||||
|
UserModel federatedUser = session.users().getUserByUsername("test-user@localhost", realm);
|
||||||
|
|
||||||
|
assertNotNull(federatedUser);
|
||||||
|
|
||||||
|
assertEquals("test-user@localhost", federatedUser.getUsername());
|
||||||
|
|
||||||
|
doAssertFederatedUser(federatedUser, identityProviderModel);
|
||||||
|
|
||||||
|
Set<FederatedIdentityModel> federatedIdentities = this.session.users().getFederatedIdentities(federatedUser, realm);
|
||||||
|
|
||||||
|
assertEquals(1, federatedIdentities.size());
|
||||||
|
|
||||||
|
FederatedIdentityModel federatedIdentityModel = federatedIdentities.iterator().next();
|
||||||
|
|
||||||
|
assertEquals(getProviderId(), federatedIdentityModel.getIdentityProvider());
|
||||||
|
|
||||||
|
driver.navigate().to("http://localhost:8081/test-app/logout");
|
||||||
|
driver.navigate().to("http://localhost:8081/test-app");
|
||||||
|
|
||||||
|
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8081/auth/realms/realm-with-broker/protocol/openid-connect/login"));
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
getRealm().setRegistrationEmailAsUsername(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSuccessfulAuthenticationWithoutUpdateProfile_newUser_emailAsUsername_emailNotProvided() {
|
||||||
|
|
||||||
|
getRealm().setRegistrationEmailAsUsername(true);
|
||||||
|
brokerServerRule.stopSession(this.session, true);
|
||||||
|
this.session = brokerServerRule.startSession();
|
||||||
|
|
||||||
|
try {
|
||||||
|
IdentityProviderModel identityProviderModel = getIdentityProviderModel();
|
||||||
|
identityProviderModel.setUpdateProfileFirstLogin(false);
|
||||||
|
|
||||||
|
authenticateWithIdentityProvider(identityProviderModel, "test-user-noemail");
|
||||||
|
|
||||||
|
RealmModel realm = getRealm();
|
||||||
|
UserModel federatedUser = session.users().getUserByUsername("test-user-noemail", realm);
|
||||||
|
assertNull(federatedUser);
|
||||||
|
|
||||||
|
// assert page is shown with correct error message
|
||||||
|
assertEquals("Email is not provided. Use another provider to create account please.", this.driver.findElement(By.className("kc-feedback-text")).getText());
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
getRealm().setRegistrationEmailAsUsername(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -313,7 +385,7 @@ public abstract class AbstractIdentityProviderTest {
|
||||||
|
|
||||||
identityProviderModel.setStoreToken(true);
|
identityProviderModel.setStoreToken(true);
|
||||||
|
|
||||||
authenticateWithIdentityProvider(identityProviderModel);
|
authenticateWithIdentityProvider(identityProviderModel, "test-user");
|
||||||
|
|
||||||
UserModel federatedUser = getFederatedUser();
|
UserModel federatedUser = getFederatedUser();
|
||||||
RealmModel realm = getRealm();
|
RealmModel realm = getRealm();
|
||||||
|
@ -435,8 +507,8 @@ public abstract class AbstractIdentityProviderTest {
|
||||||
|
|
||||||
protected abstract void doAssertTokenRetrieval(String pageSource);
|
protected abstract void doAssertTokenRetrieval(String pageSource);
|
||||||
|
|
||||||
private void assertSuccessfulAuthentication(IdentityProviderModel identityProviderModel) {
|
private void assertSuccessfulAuthentication(IdentityProviderModel identityProviderModel, String username) {
|
||||||
authenticateWithIdentityProvider(identityProviderModel);
|
authenticateWithIdentityProvider(identityProviderModel, username);
|
||||||
|
|
||||||
// authenticated and redirected to app
|
// authenticated and redirected to app
|
||||||
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8081/test-app"));
|
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8081/test-app"));
|
||||||
|
@ -464,7 +536,7 @@ public abstract class AbstractIdentityProviderTest {
|
||||||
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8081/auth/realms/realm-with-broker/protocol/openid-connect/login"));
|
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8081/auth/realms/realm-with-broker/protocol/openid-connect/login"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void authenticateWithIdentityProvider(IdentityProviderModel identityProviderModel) {
|
private void authenticateWithIdentityProvider(IdentityProviderModel identityProviderModel, String username) {
|
||||||
driver.navigate().to("http://localhost:8081/test-app");
|
driver.navigate().to("http://localhost:8081/test-app");
|
||||||
|
|
||||||
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8081/auth/realms/realm-with-broker/protocol/openid-connect/login"));
|
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8081/auth/realms/realm-with-broker/protocol/openid-connect/login"));
|
||||||
|
@ -475,7 +547,7 @@ public abstract class AbstractIdentityProviderTest {
|
||||||
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8082/auth/"));
|
assertTrue(this.driver.getCurrentUrl().startsWith("http://localhost:8082/auth/"));
|
||||||
|
|
||||||
// log in to identity provider
|
// log in to identity provider
|
||||||
this.loginPage.login("test-user", "password");
|
this.loginPage.login(username, "password");
|
||||||
|
|
||||||
doAfterProviderAuthentication();
|
doAfterProviderAuthentication();
|
||||||
|
|
||||||
|
|
|
@ -193,4 +193,76 @@ public class RegisterTest {
|
||||||
events.expectLogin().detail("username", "registerUserSuccess").user(userId).assertEvent();
|
events.expectLogin().detail("username", "registerUserSuccess").user(userId).assertEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void registerExistingUser_emailAsUsername() {
|
||||||
|
configureRelamRegistrationEmailAsUsername(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
loginPage.open();
|
||||||
|
loginPage.clickRegister();
|
||||||
|
registerPage.assertCurrent();
|
||||||
|
|
||||||
|
registerPage.registerWithEmailAsUsername("firstName", "lastName", "test-user@localhost", "password", "password");
|
||||||
|
|
||||||
|
registerPage.assertCurrent();
|
||||||
|
Assert.assertEquals("Username already exists", registerPage.getError());
|
||||||
|
|
||||||
|
events.expectRegister("test-user@localhost", "test-user@localhost").user((String) null).error("username_in_use").assertEvent();
|
||||||
|
} finally {
|
||||||
|
configureRelamRegistrationEmailAsUsername(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void registerUserMissingOrInvalidEmail_emailAsUsername() {
|
||||||
|
configureRelamRegistrationEmailAsUsername(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
loginPage.open();
|
||||||
|
loginPage.clickRegister();
|
||||||
|
registerPage.assertCurrent();
|
||||||
|
|
||||||
|
registerPage.registerWithEmailAsUsername("firstName", "lastName", null, "password", "password");
|
||||||
|
registerPage.assertCurrent();
|
||||||
|
Assert.assertEquals("Please specify email", registerPage.getError());
|
||||||
|
events.expectRegister(null, null).removeDetail("username").removeDetail("email").error("invalid_registration").assertEvent();
|
||||||
|
|
||||||
|
registerPage.registerWithEmailAsUsername("firstName", "lastName", "registerUserInvalidEmailemail", "password", "password");
|
||||||
|
registerPage.assertCurrent();
|
||||||
|
Assert.assertEquals("Invalid email address", registerPage.getError());
|
||||||
|
events.expectRegister("registerUserInvalidEmailemail", "registerUserInvalidEmailemail").error("invalid_registration").assertEvent();
|
||||||
|
} finally {
|
||||||
|
configureRelamRegistrationEmailAsUsername(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void registerUserSuccess_emailAsUsername() {
|
||||||
|
configureRelamRegistrationEmailAsUsername(true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
loginPage.open();
|
||||||
|
loginPage.clickRegister();
|
||||||
|
registerPage.assertCurrent();
|
||||||
|
|
||||||
|
registerPage.registerWithEmailAsUsername("firstName", "lastName", "registerUserSuccessE@email", "password", "password");
|
||||||
|
|
||||||
|
Assert.assertEquals(RequestType.AUTH_RESPONSE, appPage.getRequestType());
|
||||||
|
|
||||||
|
String userId = events.expectRegister("registerUserSuccessE@email", "registerUserSuccessE@email").assertEvent().getUserId();
|
||||||
|
events.expectLogin().detail("username", "registerUserSuccessE@email").user(userId).assertEvent();
|
||||||
|
} finally {
|
||||||
|
configureRelamRegistrationEmailAsUsername(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void configureRelamRegistrationEmailAsUsername(final boolean value) {
|
||||||
|
keycloakRule.configure(new KeycloakRule.KeycloakSetup() {
|
||||||
|
@Override
|
||||||
|
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
||||||
|
appRealm.setRegistrationEmailAsUsername(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,9 @@
|
||||||
*/
|
*/
|
||||||
package org.keycloak.testsuite.pages;
|
package org.keycloak.testsuite.pages;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
|
||||||
|
import org.openqa.selenium.NoSuchElementException;
|
||||||
import org.openqa.selenium.WebElement;
|
import org.openqa.selenium.WebElement;
|
||||||
import org.openqa.selenium.support.FindBy;
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
@ -87,6 +90,42 @@ public class RegisterPage extends AbstractPage {
|
||||||
submitButton.click();
|
submitButton.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void registerWithEmailAsUsername(String firstName, String lastName, String email, String password, String passwordConfirm) {
|
||||||
|
firstNameInput.clear();
|
||||||
|
if (firstName != null) {
|
||||||
|
firstNameInput.sendKeys(firstName);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastNameInput.clear();
|
||||||
|
if (lastName != null) {
|
||||||
|
lastNameInput.sendKeys(lastName);
|
||||||
|
}
|
||||||
|
|
||||||
|
emailInput.clear();
|
||||||
|
if (email != null) {
|
||||||
|
emailInput.sendKeys(email);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
usernameInput.clear();
|
||||||
|
Assert.fail("Form must be without username field");
|
||||||
|
} catch (NoSuchElementException e) {
|
||||||
|
// OK
|
||||||
|
}
|
||||||
|
|
||||||
|
passwordInput.clear();
|
||||||
|
if (password != null) {
|
||||||
|
passwordInput.sendKeys(password);
|
||||||
|
}
|
||||||
|
|
||||||
|
passwordConfirmInput.clear();
|
||||||
|
if (passwordConfirm != null) {
|
||||||
|
passwordConfirmInput.sendKeys(passwordConfirm);
|
||||||
|
}
|
||||||
|
|
||||||
|
submitButton.click();
|
||||||
|
}
|
||||||
|
|
||||||
public String getError() {
|
public String getError() {
|
||||||
return loginErrorMessage != null ? loginErrorMessage.getText() : null;
|
return loginErrorMessage != null ? loginErrorMessage.getText() : null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,17 @@
|
||||||
],
|
],
|
||||||
"realmRoles": ["manager"]
|
"realmRoles": ["manager"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"username" : "test-user-noemail",
|
||||||
|
"enabled": true,
|
||||||
|
"firstName" : "Test",
|
||||||
|
"lastName" : "User",
|
||||||
|
"credentials" : [
|
||||||
|
{ "type" : "password",
|
||||||
|
"value" : "password" }
|
||||||
|
],
|
||||||
|
"realmRoles": ["manager"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"username" : "pedroigor",
|
"username" : "pedroigor",
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
|
|
|
@ -37,6 +37,17 @@
|
||||||
],
|
],
|
||||||
"realmRoles": ["manager"]
|
"realmRoles": ["manager"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"username" : "test-user-noemail",
|
||||||
|
"enabled": true,
|
||||||
|
"firstName" : "Test",
|
||||||
|
"lastName" : "User",
|
||||||
|
"credentials" : [
|
||||||
|
{ "type" : "password",
|
||||||
|
"value" : "password" }
|
||||||
|
],
|
||||||
|
"realmRoles": ["manager"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"username" : "pedroigor",
|
"username" : "pedroigor",
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
|
|
|
@ -31,6 +31,17 @@
|
||||||
],
|
],
|
||||||
"realmRoles": ["manager"]
|
"realmRoles": ["manager"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"username" : "test-user-noemail",
|
||||||
|
"enabled": true,
|
||||||
|
"firstName" : "Test",
|
||||||
|
"lastName" : "User",
|
||||||
|
"credentials" : [
|
||||||
|
{ "type" : "password",
|
||||||
|
"value" : "password" }
|
||||||
|
],
|
||||||
|
"realmRoles": ["manager"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"username" : "pedroigor",
|
"username" : "pedroigor",
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
|
|
Loading…
Reference in a new issue