parent
bd37875a66
commit
17c3804402
2 changed files with 113 additions and 0 deletions
|
@ -84,4 +84,18 @@ public class ClientScopeRepresentation {
|
||||||
public void setAttributes(Map<String, String> attributes) {
|
public void setAttributes(Map<String, String> attributes) {
|
||||||
this.attributes = attributes;
|
this.attributes = attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || !(o instanceof ClientScopeRepresentation)) return false;
|
||||||
|
|
||||||
|
ClientScopeRepresentation that = (ClientScopeRepresentation) o;
|
||||||
|
return that.getId().equals(getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return getId().hashCode();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,10 +31,12 @@ import org.keycloak.common.util.UriUtils;
|
||||||
import org.keycloak.jose.jws.JWSInput;
|
import org.keycloak.jose.jws.JWSInput;
|
||||||
import org.keycloak.models.AccountRoles;
|
import org.keycloak.models.AccountRoles;
|
||||||
import org.keycloak.models.ClientScopeModel;
|
import org.keycloak.models.ClientScopeModel;
|
||||||
|
import org.keycloak.models.utils.ModelToRepresentation;
|
||||||
import org.keycloak.protocol.oidc.OIDCLoginProtocol;
|
import org.keycloak.protocol.oidc.OIDCLoginProtocol;
|
||||||
import org.keycloak.protocol.oidc.OIDCLoginProtocolFactory;
|
import org.keycloak.protocol.oidc.OIDCLoginProtocolFactory;
|
||||||
import org.keycloak.protocol.oidc.mappers.AddressMapper;
|
import org.keycloak.protocol.oidc.mappers.AddressMapper;
|
||||||
import org.keycloak.protocol.oidc.mappers.OIDCAttributeMapperHelper;
|
import org.keycloak.protocol.oidc.mappers.OIDCAttributeMapperHelper;
|
||||||
|
import org.keycloak.protocol.oidc.mappers.UserPropertyMapper;
|
||||||
import org.keycloak.representations.AccessToken;
|
import org.keycloak.representations.AccessToken;
|
||||||
import org.keycloak.representations.AddressClaimSet;
|
import org.keycloak.representations.AddressClaimSet;
|
||||||
import org.keycloak.representations.IDToken;
|
import org.keycloak.representations.IDToken;
|
||||||
|
@ -55,6 +57,7 @@ import org.keycloak.testsuite.updaters.ProtocolMappersUpdater;
|
||||||
import org.keycloak.testsuite.util.AdminClientUtil;
|
import org.keycloak.testsuite.util.AdminClientUtil;
|
||||||
import org.keycloak.testsuite.util.ClientManager;
|
import org.keycloak.testsuite.util.ClientManager;
|
||||||
import org.keycloak.testsuite.util.OAuthClient;
|
import org.keycloak.testsuite.util.OAuthClient;
|
||||||
|
import org.keycloak.testsuite.util.OAuthClient.AccessTokenResponse;
|
||||||
import org.keycloak.testsuite.util.ProtocolMapperUtil;
|
import org.keycloak.testsuite.util.ProtocolMapperUtil;
|
||||||
import org.keycloak.testsuite.util.UserInfoClientUtil;
|
import org.keycloak.testsuite.util.UserInfoClientUtil;
|
||||||
|
|
||||||
|
@ -68,6 +71,7 @@ import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.hamcrest.Matchers.anyOf;
|
import static org.hamcrest.Matchers.anyOf;
|
||||||
|
@ -84,10 +88,12 @@ import static org.junit.Assert.assertNotEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.keycloak.OAuth2Constants.SCOPE_PROFILE;
|
||||||
import static org.keycloak.testsuite.admin.AbstractAdminTest.loadJson;
|
import static org.keycloak.testsuite.admin.AbstractAdminTest.loadJson;
|
||||||
import static org.keycloak.testsuite.admin.ApiUtil.findClientByClientId;
|
import static org.keycloak.testsuite.admin.ApiUtil.findClientByClientId;
|
||||||
import static org.keycloak.testsuite.admin.ApiUtil.findClientResourceByClientId;
|
import static org.keycloak.testsuite.admin.ApiUtil.findClientResourceByClientId;
|
||||||
import static org.keycloak.testsuite.admin.ApiUtil.findUserByUsernameId;
|
import static org.keycloak.testsuite.admin.ApiUtil.findUserByUsernameId;
|
||||||
|
import static org.keycloak.testsuite.admin.ApiUtil.getCreatedId;
|
||||||
import static org.keycloak.testsuite.util.ProtocolMapperUtil.createAddressMapper;
|
import static org.keycloak.testsuite.util.ProtocolMapperUtil.createAddressMapper;
|
||||||
import static org.keycloak.testsuite.util.ProtocolMapperUtil.createClaimMapper;
|
import static org.keycloak.testsuite.util.ProtocolMapperUtil.createClaimMapper;
|
||||||
import static org.keycloak.testsuite.util.ProtocolMapperUtil.createHardcodedClaim;
|
import static org.keycloak.testsuite.util.ProtocolMapperUtil.createHardcodedClaim;
|
||||||
|
@ -407,6 +413,99 @@ public class OIDCProtocolMappersTest extends AbstractKeycloakTest {
|
||||||
events.clear();
|
events.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testClaimFromUserPropertyMapperWithOptionalProfileScope() {
|
||||||
|
RealmResource realm = adminClient.realm("test");
|
||||||
|
UserResource userResource = findUserByUsernameId(realm, "test-user@localhost");
|
||||||
|
UserRepresentation user = userResource.toRepresentation();
|
||||||
|
ClientResource client = findClientResourceByClientId(realm, "test-app");
|
||||||
|
Optional<ClientScopeRepresentation> profileScope = realm.clientScopes().findAll().stream().filter(scope -> SCOPE_PROFILE.equals(scope.getName())).findAny();
|
||||||
|
|
||||||
|
assertTrue(profileScope.isPresent());
|
||||||
|
|
||||||
|
String mapperId = null;
|
||||||
|
|
||||||
|
try (Response response = client.getProtocolMappers().createMapper(ModelToRepresentation.toRepresentation(UserPropertyMapper.createClaimMapper(
|
||||||
|
"test-property-mapper",
|
||||||
|
"email",
|
||||||
|
"claim-name",
|
||||||
|
String.class.getSimpleName(),
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
)))) {
|
||||||
|
mapperId = getCreatedId(response);
|
||||||
|
List<ClientScopeRepresentation> defaultClientScopes = client.getDefaultClientScopes();
|
||||||
|
|
||||||
|
assertTrue(defaultClientScopes.contains(profileScope.get()));
|
||||||
|
|
||||||
|
client.removeDefaultClientScope(profileScope.get().getId());
|
||||||
|
client.addOptionalClientScope(profileScope.get().getId());
|
||||||
|
|
||||||
|
oauth.scope(SCOPE_PROFILE);
|
||||||
|
|
||||||
|
OAuthClient.AuthorizationEndpointResponse authzEndpointResponse = oauth.doLogin("test-user@localhost", "password");
|
||||||
|
AccessTokenResponse tokenResponse = oauth.doAccessTokenRequest(authzEndpointResponse.getCode(), "password");
|
||||||
|
|
||||||
|
assertTrue(tokenResponse.getScope().contains("profile"));
|
||||||
|
|
||||||
|
IDToken idToken = oauth.verifyIDToken(tokenResponse.getIdToken());
|
||||||
|
assertEquals(user.getEmail(), idToken.getOtherClaims().get("claim-name"));
|
||||||
|
|
||||||
|
AccessToken accessToken = oauth.verifyToken(tokenResponse.getAccessToken());
|
||||||
|
assertEquals(user.getEmail(), accessToken.getOtherClaims().get("claim-name"));
|
||||||
|
} finally {
|
||||||
|
if (mapperId != null) {
|
||||||
|
client.getProtocolMappers().delete(mapperId);
|
||||||
|
}
|
||||||
|
client.removeOptionalClientScope(profileScope.get().getId());
|
||||||
|
client.addDefaultClientScope(profileScope.get().getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testClaimFromUserPropertyMapperWithDefaultProfileScope() {
|
||||||
|
RealmResource realm = adminClient.realm("test");
|
||||||
|
UserResource userResource = findUserByUsernameId(realm, "test-user@localhost");
|
||||||
|
UserRepresentation user = userResource.toRepresentation();
|
||||||
|
ClientResource client = findClientResourceByClientId(realm, "test-app");
|
||||||
|
Optional<ClientScopeRepresentation> profileScope = realm.clientScopes().findAll().stream().filter(scope -> SCOPE_PROFILE.equals(scope.getName())).findAny();
|
||||||
|
|
||||||
|
assertTrue(profileScope.isPresent());
|
||||||
|
|
||||||
|
String mapperId = null;
|
||||||
|
|
||||||
|
try (Response response = client.getProtocolMappers().createMapper(ModelToRepresentation.toRepresentation(UserPropertyMapper.createClaimMapper(
|
||||||
|
"test-property-mapper",
|
||||||
|
"email",
|
||||||
|
"claim-name",
|
||||||
|
String.class.getSimpleName(),
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
)))) {
|
||||||
|
mapperId = getCreatedId(response);
|
||||||
|
List<ClientScopeRepresentation> defaultClientScopes = client.getDefaultClientScopes();
|
||||||
|
|
||||||
|
assertTrue(defaultClientScopes.contains(profileScope.get()));
|
||||||
|
|
||||||
|
oauth.scope(SCOPE_PROFILE);
|
||||||
|
|
||||||
|
OAuthClient.AuthorizationEndpointResponse authzEndpointResponse = oauth.doLogin("test-user@localhost", "password");
|
||||||
|
AccessTokenResponse tokenResponse = oauth.doAccessTokenRequest(authzEndpointResponse.getCode(), "password");
|
||||||
|
|
||||||
|
assertTrue(tokenResponse.getScope().contains("profile"));
|
||||||
|
|
||||||
|
IDToken idToken = oauth.verifyIDToken(tokenResponse.getIdToken());
|
||||||
|
assertEquals(user.getEmail(), idToken.getOtherClaims().get("claim-name"));
|
||||||
|
|
||||||
|
AccessToken accessToken = oauth.verifyToken(tokenResponse.getAccessToken());
|
||||||
|
assertEquals(user.getEmail(), accessToken.getOtherClaims().get("claim-name"));
|
||||||
|
} finally {
|
||||||
|
if (mapperId != null) {
|
||||||
|
client.getProtocolMappers().delete(mapperId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
||||||
public void testNullOrEmptyTokenMapping() throws Exception {
|
public void testNullOrEmptyTokenMapping() throws Exception {
|
||||||
|
|
Loading…
Reference in a new issue