Propagate locale when using app initiated registration URL

Fixes #13505

Signed-off-by: Thomas Darimont <thomas.darimont@googlemail.com>
This commit is contained in:
Thomas Darimont 2024-09-10 12:25:17 +02:00 committed by GitHub
parent 7988f026e0
commit 6b83a45b2e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 57 additions and 0 deletions

View file

@ -49,6 +49,7 @@ import org.keycloak.services.clientpolicy.context.PreAuthorizationRequestContext
import org.keycloak.services.messages.Messages; import org.keycloak.services.messages.Messages;
import org.keycloak.services.resources.LoginActionsService; import org.keycloak.services.resources.LoginActionsService;
import org.keycloak.services.util.CacheControlUtil; import org.keycloak.services.util.CacheControlUtil;
import org.keycloak.services.util.LocaleUtil;
import org.keycloak.sessions.AuthenticationSessionModel; import org.keycloak.sessions.AuthenticationSessionModel;
import org.keycloak.util.TokenUtil; import org.keycloak.util.TokenUtil;
@ -351,6 +352,7 @@ public class AuthorizationEndpoint extends AuthorizationEndpointBase {
AuthenticationProcessor processor = createProcessor(authenticationSession, flowId, LoginActionsService.REGISTRATION_PATH); AuthenticationProcessor processor = createProcessor(authenticationSession, flowId, LoginActionsService.REGISTRATION_PATH);
authenticationSession.setClientNote(APP_INITIATED_FLOW, LoginActionsService.REGISTRATION_PATH); authenticationSession.setClientNote(APP_INITIATED_FLOW, LoginActionsService.REGISTRATION_PATH);
LocaleUtil.processLocaleParam(session, realm, authenticationSession);
return processor.authenticate(); return processor.authenticate();
} }

View file

@ -1512,6 +1512,10 @@ public class OAuthClient {
return this.getLoginFormUrl(this.baseUrl); return this.getLoginFormUrl(this.baseUrl);
} }
public String getRegisterationsUrl() {
return this.getLoginFormUrl(this.baseUrl).replace("openid-connect/auth", "openid-connect/registrations");
}
public String getLoginFormUrl(String baseUrl) { public String getLoginFormUrl(String baseUrl) {
UriBuilder b = OIDCLoginProtocolService.authUrl(UriBuilder.fromUri(baseUrl)); UriBuilder b = OIDCLoginProtocolService.authUrl(UriBuilder.fromUri(baseUrl));
if (responseType != null) { if (responseType != null) {

View file

@ -0,0 +1,51 @@
package org.keycloak.testsuite.actions;
import jakarta.ws.rs.core.UriBuilder;
import org.jboss.arquillian.graphene.page.Page;
import org.junit.Before;
import org.junit.Test;
import org.keycloak.locale.LocaleSelectorProvider;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.testsuite.AbstractTestRealmKeycloakTest;
import org.keycloak.testsuite.Assert;
import org.keycloak.testsuite.admin.ApiUtil;
import org.keycloak.testsuite.pages.AppPage;
import org.keycloak.testsuite.pages.RegisterPage;
public class AppInitiatedRegistrationTest extends AbstractTestRealmKeycloakTest {
@Page
protected AppPage appPage;
@Page
protected RegisterPage registerPage;
@Override
public void configureTestRealm(RealmRepresentation testRealm) {
}
@Before
public void before() {
ApiUtil.removeUserByUsername(testRealm(), "test-user@localhost");
}
@Test
public void ensureLocaleParameterIsPropagatedDuringAppInitiatedRegistration() {
var appInitiatedRegisterUrlBuilder = UriBuilder.fromUri(oauth.getRegisterationsUrl());
appInitiatedRegisterUrlBuilder.queryParam(LocaleSelectorProvider.KC_LOCALE_PARAM, "en");
var appInitiatedRegisterUrl = appInitiatedRegisterUrlBuilder.build().toString();
driver.navigate().to(appInitiatedRegisterUrl);
registerPage.assertCurrent();
registerPage.register("first", "last", "test-user@localhost", "test-user", "test","test");
appPage.assertCurrent();
UserRepresentation user = testRealm().users().searchByEmail("test-user@localhost", true).get(0);
// ensure that the locale was set on the user
Assert.assertEquals("en", user.getAttributes().get("locale").get(0));
}
}