Интерфейс подключения к промежуточному программному обеспечению, защищенный keycloak-nodejs-connect (использование по назначению)

Нужно поделиться некоторым контекстом и настройкой, прежде чем задавать мой вопрос, поэтому прошу прощения за стену текста. знак равно

Мое приложение:

  • frontend SPA является статическим ресурсом от NGINX (http://frontend)

  • keycloak сервер работает на http://keycloak

  • middleware это приложение NodeJS, которое frontend связывается с конечной точкой API (например: http://middleware). Промежуточное ПО использует keycloak-nodejs-connect ( https://github.com/keycloak/keycloak-nodejs-connect) для защиты конечной точки API

Код установки в промежуточном программном обеспечении выглядит следующим образом:

const session = require('express-session')
const memoryStore = new session.MemoryStore()

app.use(session({
  secret: 'mySecret',
  resave: false,
  saveUninitialized: true,
  store: memoryStore
}))

const keycloak = require('./auth/keycloak')
app.use(keycloak.middleware({
  logout: '/logout'
}))

Настройка в auth/keycloak.js является:

const keycloakConfig = {
  'realm': 'realmName',
  'auth-server-url': `http://keycloak/auth`,
  'ssl-required': 'external',
  'resource': 'clientName',
  'credentials': {
    'secret': 'aaaaaaaa-bbbb-cccc-dddd-1a49c9dfbbef'
  }
}

module.exports = new Keycloak({store: memoryStore, responseType: 'code'}, keycloakConfig)

когда пользователь нажимает ссылку "/ логин" из внешнего интерфейса, frontend порождает новую вкладку и вызовы новой вкладки http://middleware/login, Мотивация заключается в том, что существующее состояние в пользовательском интерфейсе не затрагивается, все перенаправления и т. Д. Происходят в новом окне. Код в middleware выглядит так:

app.get('/login', keycloak.protect(), (req, res) => {
  const keycloakTokens = JSON.parse(req.session['keycloak-token'])
  const userInfo = JSON.stringify(decodeToken(keycloakTokens))
  res.status(200).send(`<html><head>
        <script type="text/javascript">
            window.opener.postMessage(${userInfo}, 'http://frontend')
            window.close()
        </script>
    </head></html>`)
})

const decodeToken = ({id_token}) => {
  const payload = JSON.parse(atob(id_token.split('.')[1]))
  return payload
}

Таким образом, идея состоит в том, что после танца OIDC промежуточное программное обеспечение ответит, прося новую вкладку postMessage к opener (родитель) с содержанием id_token JWT.

Предположение 1: сеанс в куки connect.sid это то, что промежуточное программное обеспечение использует для проверки подлинности пользователя. Это предположение верно?

есть слушатель события в frontend что следит за postMessage и сохраняет информацию, отправленную (id_token) в localStorage.

Вопрос 1: это правильный способ входа в систему с учетом настроек, описанных выше?

Я думаю, что я определенно что-то упускаю, потому что другой защищенный маршрут в middleware вызывает перенаправление на keycloak еще раз говорю мне, что промежуточное ПО не знает frontend аутентифицирован.

Вопрос 2: как будет работать выход из системы в этом случае? просто очистить куки браузера?

Я попробовал пример приложения ( https://github.com/keycloak/keycloak-nodejs-connect/tree/master/example), но у него другая архитектура, браузер указывает на домен промежуточного программного обеспечения.

пожалуйста, дайте мне знать, если вы ищете больше фрагментов кода или деталей. Рад предоставить.

0 ответов

Другие вопросы по тегам