keycloak Custom Login provider not getting invoked with version 19

255 views Asked by At

We were using Custom Login provider with keycloak 18 version and everything works fine.

But when we upgrade to keycloak version 19, Custom Login Provider is not getting invoked.

In the below example we can see that CustomProviderFactory create method should be invoked, it works well with keycloak 18 version, but its not working with keycloak 19 version. All the jboss deployment.xml are in place.

Ex

public class CustomProviderFactory extends FreeMarkerLoginFormsProviderFactory {
private FreeMarkerUtil freeMarker;

    @Override
    public LoginFormsProvider create(KeycloakSession session) {
        return new CustomLoginFormsProvider(session, freeMarker);
    }

    @Override
    public void init(Config.Scope config) {
        freeMarker = new FreeMarkerUtil();
    }

    @Override
    public void close() {
        freeMarker = null;
    }

    @Override
    public String getId() {
        return "freemarker";
    }

}

public class CustomLoginFormsProvider extends FreeMarkerLoginFormsProvider {

   
    public LoginFormsProvider(KeycloakSession session, FreeMarkerUtil freeMarker) {
        super(session, freeMarker);
    }

    @Override
    protected void createCommonAttributes(Theme theme, Locale locale, Properties messagesBundle, UriBuilder baseUriBuilder, LoginFormsPages page) {
        super.createCommonAttributes(theme, locale, messagesBundle, baseUriBuilder, page);
        
    }

}
1

There are 1 answers

0
DEResnick On

I'm using Keycloak 22.0.5

I needed to set these properties - I did this on the Keycloak start command line:

--spi-login-provider=<the string returned by getId() in my factory class>
--spi-login-<the string returned by getId() in my factory class>-enabled=true

Where my factory class extends FreeMarkerLoginFormsProviderFactory

I did not use Freemarker for the string returned by getId(); I used my own ID.

I made the ID like the class name for my class that extends FreeMarkerLoginFormsProvider

For example, if my custom classes were named:

 public class MyGoodClass extends FreeMarkerLoginFormsProvider { ... }

 public class MyGoodClassFactory extends FreeMarkerLoginFormsProviderFactory { ... }

I made my getId() method in MyGoodClassFactory return my-good-class:

@Override
public String getId() {
    return "my-good-class";
}

So then the property settings would be:

  --spi-login-provider=my-good-class

  --spi-login-my-good-class-enabled=true

Also, remember to create the file in {top level of extension}/src/main/resources/META-INF/services/org.keycloak.forms.login.LoginFormsProviderFactory and it should contain this one line (based on above example):

org.xgs.keycloak.forms.login.MyGoodClassFactory

Hope this helps.