Как настроить Node.js сервер с аутентификацией KeyCloak на основе cook ie - теперь можно получать бесконечные перенаправления - PullRequest
2 голосов
/ 10 января 2020

Я настраиваю сервер 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, который выглядит следующим образом: enter image description here

Я читал много источников в Интернете, этот репо https://github.com/v-ladynev/keycloak-nodejs-example/blob/master/lib/keyCloakService.js - это тот, который имеет решение без сохранения состояния на основе Cook ie, но он повторно реализует различные функции keycloak-connect.

Я бы предпочел простое решение, которое можно напрямую подключить к keycloak-connect, если это возможно.

Любая помощь ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...