поток аутентификации на основе перенаправления защищен приложением keycloak node.js за шлюзом приложения - PullRequest
0 голосов
/ 09 октября 2018

Я получаю сообщения об отказе в доступе в защищенном приложении node.js, которое является официальным примером ключевого ключа

Защищенное приложение было закреплено в доке и помещено за шлюзом приложения, который сам докеризован.

Шлюз приложения - это приложение node.js express, которое использует пакеты http / https и направляет входящий трафик в защищенное приложение node.js.

Таким образом, для доступа к URL-адресам приложения были добавлены URL-адреса.шлюз:

 mappings:
    - /:/
    - /login:/login        
    - /logout:/logout
    - /protected/resource:/protected/resource  

Шлюз выполняет ssl-разгрузку.Keycloak также докернизирован, и его конечная точка / auth была сопоставлена ​​внутри шлюза.

Код приложения ниже:

var Keycloak = require('keycloak-nodejs-connect');
var hogan = require('hogan-express');
var express = require('express');
var session = require('express-session');

var app = express();

var server = app.listen(3005, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});

app.set('view engine', 'html');
app.set('views', require('path').join(__dirname, '/view'));
app.engine('html', hogan);

app.enable('trust proxy')
var memoryStore = new session.MemoryStore();
app.use(session({
  secret: 'mySecret',
  resave: false,
  saveUninitialized: true,
  store: memoryStore
}));

app.get('/', function (req, res) {
  res.render('index');
});

var memoryStore = new session.MemoryStore();

app.use(session({
  secret: 'mySecret',
  resave: false,
  saveUninitialized: true,
  store: memoryStore
}));

// Additional configuration is read from keycloak.json file
// installed from the Keycloak web console.

var keycloak = new Keycloak({
  store: memoryStore
});

app.use(keycloak.middleware({
  logout: '/logout',
  admin: '/',
  protected: '/protected/resource'
}));

app.get('/login', keycloak.protect(), function (req, res) {
  res.render('index', {
    result: JSON.stringify(JSON.parse(req.session['keycloak-token']), null, 4),
    event: '1. Authentication\n2. Login'
  });
});

app.get('/protected/resource', keycloak.enforcer(['resource:view', 'resource:write'], {
  resource_server_id: 'nodejs-apiserver'
}), function (req, res) {
  res.render('index', {
    result: JSON.stringify(JSON.parse(req.session['keycloak-token']), null, 4),
    event: '1. Access granted to Default Resource\n'
  });
});

keycloak.json is:

{
  "realm" : "nodejs-example",
  "realm-public-key" : "[public_key]",
  "auth-server-url" : "https://[https://[gateway_url]]/auth",
  "ssl-required" : "none",
  "resource" : "nodejs-connect",
  "public-client" : true
}

Когда в браузере осуществляется доступ к https://[gateway_url]/, KeyCloak перенаправляет на пользовательский интерфейс входа в систему, пользователь / пароль вводится в пользовательском интерфейсе входа в систему, и после этого ошибка доступа запрещенавидно в браузере.

В журналах приложения появляется сообщение об ошибке:

Не удалось получить код ошибки: {Ошибка: самозаверяющий сертификат в цепочке сертификатов

Так что в основном приложение не может обменять код авторизации на токен доступа.

Что я пробовал:

1) Доступ к конечной точке токена Keycloak с помощью curl выполняется следующим образом (токен Access / Refresh возвращается):

 curl -k --key [keypath] --cert [certpath:passphrase] -d "grant_type=authorization_code&client_id=nodejs-connect&redirect_uri=https://[gw_url]/login?auth_callback=1&client_session_state=[client_state]&code=[authz_code]
     -X POST 'https://[gw_url]/auth/realms/nodejs-example/protocol/openid-connect/token'

2) изменив " auth-server-url " на " https : // [gateway_url]: 8080 / auth " в keycloak.json тоже помогло.Токен доступа возвращается.8080 - это опубликованный порт док-контейнера Keycloak.

Итак, я думаю, проблема в том, что адаптер node.js в приложении не предоставляет сертификат ssl для шлюза, когда он хочет заменить код authz токеном доступа.Поэтому я попытался изменить auth-server-url на относительный / auth.Однако

Не удалось получить ошибку кода предоставления: {Ошибка: подключение ECONNREFUSED 127.0.0.1:80

выскакивает внутри журналов приложения.

Как правильно настроить адаптер keycloak node.js для защиты служб за шлюзом приложений?

1 Ответ

0 голосов
/ 13 января 2019

Эй, у меня была та же ошибка, и я исправил ее, введя IP-адрес локальной сети в keycloak.json вместо имени хоста.

...