Хорошо, я нашел обходной путь, который включает в себя множество js хаков.
1.
Я изменил login.ftl своей темы входа в систему, чтобы она не просто была href для социальных сетей. провайдеры, но выполнить некоторые js. Итак, раньше это было:
<a href="${p.loginUrl}" id="zocial-${p.alias}" class="zocial ${p.providerId}">
Теперь это так:
<a onclick="openInPopUp('${p.loginUrl}', '${name}')" id="zocial-${p.alias}" class="zocial ${p.providerId}">
<form id="kc_social_continue" method="post">
</form>
<script>
function openInPopUp(url, name) {
let popup = window.open(url, name, 'toolbar=no,width=600,height=600');
let receiveMessage = (event) => {
if (event.origin !== (window.location.protocol + '//' + window.location.hostname)){
return;
}
document.forms['kc_social_continue'].action = event.data;
document.forms['kc_social_continue'].submit();
};
window.addEventListener('message', receiveMessage, false);
}
</script>
Что он делает, это открывает провайдер идентификации во всплывающем окне.
Кроме того, зарегистрирован прослушиватель сообщений, который ожидает URL в качестве тела сообщения. При получении сообщения на соответствующий URL-адрес публикуется пустая форма.
2.
Добавьте пользовательский SPI для аутентификации. Это не что иное, как представление пользовательского шаблона бесплатного маркера пользователю.
public class ClosePopupAuthenticator implements Authenticator {
@Override
public void authenticate(AuthenticationFlowContext context) {
Response challenge = context.form().createForm("close-popup.ftl");
context.challenge(challenge);
}
@Override
public void action(AuthenticationFlowContext context) {
context.success();
}
}
Этот close-popup.ftl отправляет свой URL-адрес loginAction в родительское окно и затем закрывается.
<script>
let host = window.location.hostname;
let protocol = window.location.protocol;
window.opener.postMessage("${url.loginAction}", protocol + '//' + host);
window.close();
</script>
3.
Добавьте этот новый SPI в новый поток и установите этот поток как «Поток после входа в систему» для всех соответствующих поставщиков удостоверений.