Интерфейс подключения к промежуточному программному обеспечению, защищенный 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), но у него другая архитектура, браузер указывает на домен промежуточного программного обеспечения.
пожалуйста, дайте мне знать, если вы ищете больше фрагментов кода или деталей. Рад предоставить.