Я настраиваю сервер Node.js, который защищен KeyCloak. Это первый раз, когда я использую KeyCloak, я экспериментирую с различными вариантами использования.
Я успешно реализовал сценарий, в котором я использую express-session
и MemoryStore
с клиентом publi c. Вот мой keycloak.json
:
{
"realm": "keycloak-node-monolith",
"auth-server-url": "http://localhost:8180/auth",
"ssl-required": "external",
"resource": "keycloak-node-monolith-public",
"public-client": true,
"confidential-port": 0
}
Вот мой рабочий код сервера:
var session = require('express-session');
var Keycloak = require('keycloak-connect');
var express = require('express');
var app = express();
var memoryStore = new session.MemoryStore();
app.use(session({
secret: 'uhlulululu',
resave: false,
saveUninitialized: true,
store: memoryStore
}));
var keycloak = new Keycloak({ store: memoryStore });
app.use( keycloak.middleware());
app.get( '/check-sso', keycloak.checkSso(), (req, res) => {
res.send('Check sso success');
});
app.get( '/protected', keycloak.protect(), (req, res) => {
res.send('Protected content visible to you, because you are authenticated.');
});
app.listen(4000, '0.0.0.0', () => {console.log('App listening on port 3000');});
У меня возникли проблемы при переходе на рабочий код выше, чтобы использовать куки вместо из MemoryStore.
Мой keycloak.json
такой же, как указано выше, он работает, поэтому я не вижу причин для его изменения.
Я применил следующие изменения в своем коде:
- Я инициализирую KeyCloak с
{ cookies: true }
. Я уверен, что это хороший шаг, он заставит keycloak-connect
использовать встроенный CookieStore
. - Я добавил
cookieParser
, чтобы сделать куки доступными. - Я пытался добавив
cookie-session
или express-session
, в противном случае я получаю сообщение об ошибке пропавшего session.id
.
Этот мой код теперь:
var Keycloak = require('keycloak-connect');
var express = require('express');
var cookieSession = require('cookie-session');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var app = express();
app.use(cookieParser('secret123'));
//app.use(session({
// secret: 'secret123',
// resave: false,
// saveUninitialized: true,
// cookie: {}
//));
app.use(cookieSession({
name: 'session',
secret: 'secret123',
maxAge: 24 * 60 * 60 * 1000 // 24 hours
}));
//https://access.redhat.com/documentation/en-us/red_hat_single_sign-on/7.0/html-single/securing_applications_and_services_guide/index#applicationclustering
var keycloak = new Keycloak({ cookies: true });
app.use( keycloak.middleware());
app.get( '/check-sso', keycloak.checkSso(), (req, res) => {
res.send('Check sso success');
});
app.get( '/protected', keycloak.protect(), (req, res) => {
res.send('Protected content visible to you, because you are authenticated!');
});
app.listen(3000, '0.0.0.0', () => {console.log('App listening on port 3000');});
Когда я посещаю localhost:3000/protected
Я перенаправлен в KeyCloak и могу успешно пройти аутентификацию. Затем меня перенаправляют на localhost:3000/protected
, файлы cookie создаются и передаются на сервер.
После аутентификации я вижу бесконечный редирект l oop, который выглядит следующим образом:
Я читал много источников в Интернете, этот репо https://github.com/v-ladynev/keycloak-nodejs-example/blob/master/lib/keyCloakService.js - это тот, который имеет решение без сохранения состояния на основе Cook ie, но он повторно реализует различные функции keycloak-connect
.
Я бы предпочел простое решение, которое можно напрямую подключить к keycloak-connect
, если это возможно.
Любая помощь ценится.