Библиотека Keycloak JS: перенаправление iframe, когда вы уже вошли в систему - PullRequest
0 голосов
/ 10 апреля 2019

Я работаю над SPA, который использует keycloak.js для взаимодействия с моим сервером Keycloak.Я инициализирую объект Keycloak с onload = 'check-sso' и включенным checkLoginIFrame.

Если я выполняю следующие шаги:

  • Загрузка моего сайта
  • Нажмите мойКнопка «Войти» (вызов Keycloak.login ())
  • перенаправить на страницу входа в Keycloak, войти, перенаправить обратно в мое приложение
  • Перезагрузить мой сайт

Я заметил, что при перезагрузке сайта происходит быстрое перенаправление (URL-адрес кратко меняется с mysite.com на mysite.com/#state=… .. затем обратно на mysite.com).Я хотел бы избежать перенаправления, когда я уже вошел в систему.

Отладив код, я выяснил, почему это происходит:

  • login-status-iframe.html page - это просто оболочка для некоторого статического JS для управления файлом cookie, в котором хранятся токены аутентификации.
  • Вызывается его основной метод checkState(...) (через сообщение из keycloak.js)во время инициализации… без токена (sessionState пусто, так как keycloak.js не знает о куки).
  • Код входа в систему iFrame считывает куки и создает XHR-запрос к mykeycloak.com / .../login-status-iframe.html/init? ... (с файлом cookie в заголовках запроса).
  • Когда он получает ответ 204 (что я имею в виду: файл cookie действителен, все в порядке), он сравнивает токен (из cookie) с тем, что он был получен из keycloak.js (т.е. ничего).
  • Так как они не равны, он отвечает на обратный вызов «изменено».
  • Это интерпретируется в keycloak.js, что означает, чтотокен изменился?) и поэтому он вызывает doLogin(false), где он меняет URL, создавая нежелательное перенаправление.

Итак, мои вопросы таковы:

  • Где документация по API для вызова login-status-iframe.html / init ?
  • Можно ли сделать что-то вроде:
    • Иметь логин-status-iframe возвращает токен, когда сервер KC сообщает ему, что токен все еще действителен (например, «обновить XXXXX» вместо «изменен»)
    • keycloak.js затем примет это и обновит свой токен,без необходимости звонить doLogin()
...