приложение keycloak-nodejs-connect express.js за обратным прокси
Я создал приложение node.js с промежуточным программным обеспечением Keycloak для Express JS, которое, как известно, «работает на моем компьютере».
const Keycloak = require('keycloak-connect')
const express = require('express')
const session = require('express-session')
const app = express()
const LOGIN_PATH = '/login'
const LOGOUT_PATH = '/logout'
const SESSION_STORE_PASS = '123456789012345678901234567890!!!'
const server = app.listen(3000, function () {
const host = server.address().address
const port = server.address().port
console.log('Example app listening at http://%s:%s', host, port)
})
app.get('/', function (req, res) {
res.redirect(LOGIN_PATH)
})
// Create a session-store to be used by both the express-session
// middleware and the keycloak middleware.
const memoryStore = new session.MemoryStore()
app.use(session({
secret: SESSION_STORE_PASS,
resave: false,
saveUninitialized: true,
store: memoryStore
}))
const kcOptions = {
"realm": "nodejs-example",
"realm-public-key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB",
"auth-server-url": "http://localhost:8080/auth",
"ssl-required": "external",
"resource": "nodejs-connect",
"public-client": true
}
console.log("Starting Keycloak connector with options: ", kcOptions)
const keycloak = new Keycloak({store: memoryStore}, kcOptions)
app.use(keycloak.middleware({
logout: LOGOUT_PATH, // <-- this is supposed to delete the session and log you out from KC as well
admin: '/'
}))
app.get('/login', keycloak.protect(), async function (req, res) {
let token
try {
const grant = await keycloak.getGrant(req, res)
token = grant.access_token
console.log(`Found token ${token}`)
} catch (e) {
console.log("Unable to find the token in KC response ", req.session)
throw new Error(e)
}
const userProfile = await keycloak.grantManager.userInfo(token)
console.log("Found user profile:", userProfile)
res.header("Content-Type", 'application/json')
return res.send(JSON.stringify(userProfile, null, 4))
})
Это приложение прослушивает порт 3000, но проблема в том, что браузеры будут подключаться к нему через обратный прокси-сервер (порт 80). И у меня нет возможности заставить промежуточное ПО отправлять правильный параметр запроса «redirect_uri» в Keycloak. Он всегда помещает URL-адрес с тем же портом 3000, который прослушивает локальный сервер.
я нашел
redirection-url
установление в документации , но я не нашел никаких доказательств этой строки в репозитории GitHub.
1 ответ
Из некоторого кода в анализарепозитории keycloak-nodejs-connect ,
redirect_uri
Параметр запроса просто собирается из входящего запроса при условии, что приложение доступно напрямую.
И эта проблема влияет как на вход, так и на выход из системы. Поэтому - к сожалению, - нет возможности использовать эту библиотеку в реальной ситуации (когда задействован обратный прокси-сервер или балансировщик нагрузки).
Не говоря уже о странном разрыве между функциями, описанными в документации, и реально реализованными.