Мы настраиваемся в Keycloak следующим образом:
[img]https://i .sstatic.net/8UZV5.png[/img]

Для сбора этой информации из сертификата мы используем следующее (что, кстати, хорошо работает, когда мы его используем для получения информации о сертификате для формы, если мы используем обычную регистрацию):
p>
Код: Выделить всё
package com.mycompany.pki.pkihelper;
...
import org.jboss.resteasy.spi.HttpRequest;
...
import org.jboss.logging.Logger;
public class CertHelper {
private static final Logger logger = Logger.getLogger(CertHelper.class);
private static String removeBeginEndPem(String pem) {
pem = pem.replace("-----BEGIN CERTIFICATE-----", "");
pem = pem.replace("-----END CERTIFICATE-----", "");
pem = pem.replace("\r\n", "");
pem = pem.replace("\n", "");
return pem.trim();
}
...
public static String getCertificateUserName(HttpRequest httpRequest) {
String firstName = getCertificateFirstName(httpRequest);
String lastName = getCertificateLastName(httpRequest);
String userName = firstName+ "." + lastName;
if(firstName == ""){
return "";
}else{
return userName;
}
}
...
}
Код: Выделить всё
package com.mycomponay.authentication;
import org.keycloak.authentication.AuthenticationFlowContext;
import org.keycloak.authentication.Authenticator;
import org.keycloak.authentication.authenticators.browser.UsernamePasswordForm;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserProvider;
import com.mycompoany.pki.pkihelper.CertHelper;
public class InternalAuthenticator implements Authenticator {
@Override
public void authenticate(AuthenticationFlowContext context) {
String username = context.getHttpRequest().getDecodedFormParameters().getFirst(UsernamePasswordForm.ATTEMPTED_USERNAME);
RealmModel realm = context.getRealm();
UserProvider userProvider = context.getSession().userStorageManager();
UserModel userModel = userProvider.getUserByUsername(username, realm);
if (userModel == null) {
// If the user doesn't exist, create a new user
username = CertHelper.getCertificateUserName(context.getHttpRequest());
userModel = createUser(context, realm, username);
userModel.setFirstName(CertHelper.getCertificateFirstName(context.getHttpRequest()));
userModel.setLastName(CertHelper.getCertificateLastName(context.getHttpRequest()));
userModel.setEmail("testuser@mycompany.com");
userModel.setEnabled(true);
}
context.setUser(userModel);
context.success();
}
private UserModel createUser(AuthenticationFlowContext context, RealmModel realm, String username) {
KeycloakSession session = context.getSession();
UserProvider userProvider = session.userStorageManager();
UserModel newUser = userProvider.addUser(realm, username);
newUser.setSingleAttribute("username", username);
session.getTransactionManager().commit();
return newUser;
}
@Override
... // other overridden methods
}
Код: Выделить всё
20:48:32,938 WARN [org.keycloak.services] (default task-3) KC-SERVICES0013: Failed authentication: org.keycloak.authentication.AuthenticationFlowException: Not found serialized context in clientSession
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.authenticators.broker.AbstractIdpAuthenticator.authenticate(AbstractIdpAuthenticator.java:68)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.DefaultAuthenticationFlow.processSingleFlowExecutionModel(DefaultAuthenticationFlow.java:446)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.DefaultAuthenticationFlow.processFlow(DefaultAuthenticationFlow.java:250)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.AuthenticationProcessor.authenticateOnly(AuthenticationProcessor.java:1017)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.authentication.AuthenticationProcessor.authenticate(AuthenticationProcessor.java:879)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.protocol.AuthorizationEndpointBase.handleBrowserAuthenticationRequest(AuthorizationEndpointBase.java:151)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildAuthorizationCodeAuthorizationResponse(AuthorizationEndpoint.java:338)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.process(AuthorizationEndpoint.java:194)
at org.keycloak.keycloak-services@19.0.3//org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildGet(AuthorizationEndpoint.java:112)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Подробнее здесь: https://stackoverflow.com/questions/767 ... ficate-aut