Keycloak - внешние ВПЛ в Pop Up - PullRequest
0 голосов
/ 17 февраля 2020

Я использую keycloak в iframe. За моей клавиатурой скрываются некоторые вторичные ВПЛ, такие как Google и Facebook.

В моей текущей конфигурации клавиатура просто перенаправляет на этих вторичных ВПЛ. Это означает, что они открыты в рамках iframe. Я бы очень хотел это изменить, поскольку это противоречит некоторым основным политикам безопасности, которые у меня есть.

Могу ли я как-то сказать keycloak открывать внешние IDP во всплывающем окне? Я прочитал «Руководство по администрированию сервера», но не смог найти информацию, касающуюся этой проблемы.

1 Ответ

0 голосов
/ 26 февраля 2020

Хорошо, я нашел обходной путь, который включает в себя множество 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 в новый поток и установите этот поток как «Поток после входа в систему» ​​для всех соответствующих поставщиков удостоверений.

...