Keycloak 7.3.0GA Server
Using Library keycloak-services 3.4.3
Our team is having trouble getting our Keycloak protocol mapper to invoke during a token call:
- The mapper is registered at startup and is available in the list of mappers for our clients
- We add the mapper in the KC UI for our client
- When I try the "Evaluate" tab, the custom mapper (Stackoverflow Custom Mapper) does show in the list as one of the "Effective Protocol Mappers"
- However the mapper does not seem to be invoked from the Java side, I see nothing in my logs
- At this point we're just hoping to see our log statement for
transformAccessToken
and the test claim we've added
Evaluate Tab: Evaluate Tab Image
Java Code:
public class SoamProtocolMapper extends AbstractOIDCProtocolMapper implements OIDCAccessTokenMapper, OIDCIDTokenMapper, UserInfoTokenMapper{
public static final String PROVIDER_ID = "oidc-customprotocolmapper";
private static Logger logger = Logger.getLogger(SoamProtocolMapper.class);
private static final List<ProviderConfigProperty> configProperties = new ArrayList<ProviderConfigProperty>();
@Override
public List<ProviderConfigProperty> getConfigProperties() {
logger.info("SOAM: inside getConfigProperties");
return configProperties;
}
@Override
public String getDisplayCategory() {
logger.info("SOAM: inside getDisplayCategory");
return TOKEN_MAPPER_CATEGORY;
}
@Override
public String getDisplayType() {
logger.info("SOAM: inside getDisplayType");
return "Stackoverflow Custom Protocol Mapper";
}
@Override
public String getId() {
logger.info("SOAM: inside getId");
return PROVIDER_ID;
}
@Override
public String getHelpText() {
logger.info("SOAM: inside getHelpText");
return "some help text";
}
@Override
public AccessToken transformAccessToken(AccessToken token, ProtocolMapperModel mappingModel, KeycloakSession session,
UserSessionModel userSession, AuthenticatedClientSessionModel clientSession) {
logger.info("SOAM: inside transformAccessToken");
token.getOtherClaims().put("stackoverflowCustomToken", "stackoverflow");
setClaim(token, mappingModel, userSession, session);
return token;
}
public static ProtocolMapperModel create(String name, boolean accessToken, boolean idToken, boolean userInfo) {
logger.info("SOAM: inside create");
ProtocolMapperModel mapper = new ProtocolMapperModel();
mapper.setName(name);
mapper.setProtocolMapper(PROVIDER_ID);
mapper.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
Map<String, String> config = new HashMap<String, String>();
mapper.setConfig(config);
return mapper;
}}
Anything helps - thanks!