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