Сохраняйте аутентификацию между двумя приложениями с помощью Keycloak SSO - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть 2 приложения JHipster, каждое из которых работает на одном поддомене (app1.domain.tld & app2.domain.tld).

В обоих приложениях пользователи входят через Keycloak.Последовательность такова:

  1. Приложение Angular отправляет / аутентифицирует запрос с учетными данными в Keycloak
  2. В случае успешного ответа возвращает cookie аутентификации
  3. Запрос POST is isотправляется в бэкэнд-приложение Jhipster, которое генерирует файл cookie JSessionID
  4. Затем JSessionID используется для каждого запроса к поддерживаемому приложению.

Каков наилучший способ автоматического входа пользователя в систему (без запроса имени пользователя ипароль), если они уже зарегистрированы в одном из приложений домена (* .domain.tld)?

Я пытался использовать JSessionID в качестве глобального токена, прежде чем понять, что он работает только в приложении, которое было сгенерированоon ...

Может быть, перехватить файл cookie аутентификации Keycloak (возвращенный на шаге 2) и выполнить аутентификацию во втором приложении, это поможет?

Из того, что я видел во время тестирования, после аутентификации в первом приложении, когда я перехожу ко второму, HTTP-перехватчик Angular 401 перенаправляет на страницу входа в Keycloak с сеансоммаркер.Таким образом, в это время Keycloak должен видеть, что я уже вошел в систему, и должен перенаправить меня на домашнюю страницу моего второго приложения.

Я прав?

1 Ответ

0 голосов
/ 20 декабря 2018

Адаптер javascript решает эту проблему, создавая iframe , который загружается с сервера аутентификации.

Из документов keycloak :

iframe Status Session Status

По умолчанию адаптер JavaScript создает скрытыйiframe, который используется для определения наличия единого выхода.Для этого не требуется сетевой трафик, вместо этого статус восстанавливается путем просмотра специального cookie-файла состояния.Эту функцию можно отключить, установив checkLoginIframe: false в параметрах, передаваемых методу init. Вы не должны полагаться на просмотр этого файла cookie напрямую.Его формат может меняться, и он также связан с URL-адресом сервера Keycloak, а не вашего приложения.

Успешный обратный вызов функции init имеет параметр, который дает статус аутентификации пользователя.

<script src="keycloak.js"></script>
<script>
    var keycloak = Keycloak();
    keycloak.init().success(function(authenticated) {
        alert(authenticated ? 'authenticated' : 'not authenticated');
    }).error(function() {
        alert('failed to initialize');
    });
</script>

Если пользователь прошел проверку подлинности, перенаправьте пользователя на страницу входа в систему, поскольку пользователь уже прошел проверку подлинности, нет необходимости вводить учетные данные еще раз.Адаптер может обрабатывать это автоматически, если он инициализирован с опцией onload check-sso

Для получения дополнительной информации о внутренней работе адаптера javascript, источник можно найти здесь

...