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

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

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

  • 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)

, когда пользователь нажимает ссылку "/ login" из внешнего интерфейса, 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: сеанс в cookie connect.sid - это то, что промежуточное ПО использует дляубедитесь, что пользователь все еще аутентифицирован. Является ли это предположение точным?

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

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

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

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

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

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

...