Применение политики Keycloak для nodejs REST Api - PullRequest
1 голос
/ 14 мая 2019

Это первый раз, когда я спрашиваю что-то здесь, так что извините, если я забуду предоставить некоторую информацию или любые другие ошибки .. Извините за текстовую стену.

Коротко, что я пытаюсь сделать

(может, я что-то не так понял): Я создаю бэкэнд (только для Bearer node.js), который должен предлагать REST API. Частично он используется через внешний интерфейс (keycloak-клиентов) или напрямую некоторыми устройствами. В общем, я пытаюсь создать приложение с большим количеством CRUD. Управление пользователями осуществляется в keycloak, и только я пересылаю эти запросы администратору REST Api. Другие вещи, такие как устройства ... Я храню в отдельной базе данных. Таким образом, бэкэнд является слоем абстракции для внешнего интерфейса и других вариантов использования.

Пока все хорошо, но для начала достаточно было проверить, поступил ли запрос от аутентифицированного лица или нет, поэтому все было обработано с помощью keycloak.protect (). Токен от аутентифицированного лица был передан. Но теперь я хотел бы предложить другой уровень авторизации (может отличаться по причине многопользовательского режима, почему я хочу решить эту проблему с помощью политик и co в консоли администратора внутри конфигурации клиента), поскольку обычный пользователь должен иметь доступ только к некоторым маршрутам. и управление должно иметь полный доступ к API, но, конечно же, не нужен доступ администратора Keycloak. Поэтому я включил служебную учетную запись для своего внутреннего клиента и назначил ей роль администратора области, чтобы клиент имел доступ ко всему, и я мог самостоятельно обрабатывать авторизацию внутри внутреннего клиента (используя политики, разрешения и ... внутри администратора). приставка). (На всякий случай, если никто не понимает, о чем я говорю. Исправление должно помочь мне решить мою проблему, я думаю)

Настройка

  • приложение node.js, использующее экспресс
  • зарегистрирован как отдельный клиент в админ-консоли keycloak (конфиденциально, но конфигурация внутри кода доступна только для канала-носителя)
  • Keycloak работает в Docker-контейнере (версия 4.5)
  • все сервисы работают в сети docker-compose и находятся за обратным прокси для общего uri
  • включил Авторизацию на клиенте и изменил политику по умолчанию на Отрицательную, чтобы всегда запрещать =>, чтобы проверить, применяется ли она)

Мой код


app.js

const express = require('express');
const app = express();
const Keycloak = require('keycloak-connect');
const session = require('express-session');
const routes = require('./routes/index');


const kcConfig = {
    'realm': 'master',
    'bearer-only': true,
    'auth-server-url': `https://DOMAIN/auth`,
    'ssl-required': 'all',
    'resource': 'fm-backend',
    'credentials': {
        secret: 'SOME_SECRET',
    },
    'confidential-port': 0,
    'policy-enforcer': {   //tried with an without this, changed nothing
        'enforcement-mode': 'ENFORCING',
    },
};

const memoryStore = new session.MemoryStore();
const keycloak = new Keycloak({ memoryStore }, kcConfig);

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

// used before, worked for well for authentication
app.use('/api', keycloak.protect(), routes);

// now unfortunately I don't understand how to use keycloak.enforcer() middleware
app.use('/api', keycloak.enforcer({WHAT_COMES_HERE}), routes);

module.exports = app;

Моя проблема

Я не понимаю, как использовать политики, разрешения и Co, которые я создал в консоли администратора внутри бэкэнда. Как заставить их использовать? Я пытался проверить разные примеры и документацию, но смог заставить ее работать. Последнее, что я обнаружил, было то, что API-интерфейс прав был удален, но к адаптеру nodejs был добавлен механизм принудительного применения политики. В документации для исполнителя политики я не смог найти документацию промежуточного программного обеспечения (keycloak.enforcer({})) Link1 Link2 .

Любая помощь приветствуется:)

1 Ответ

0 голосов
/ 27 июня 2019

У меня тоже не было на все 100% ума, но моя реализация принудительного механизма работает так:

const resource = 'MyProtectedResource';
const scope = 'myScope'; // for example read
const permission = resource + ':' + scope;
keycloak.enforcer(permission, { response_mode: 'token' }); // for your config: app.use('/api', keycloak.enforcer(permission, {response_mode: 'token' }, routes};

Где я настроил ресурс, область действия, политики и разрешения в консоли администратора keycloak для этого клиента (на вкладке «Авторизация»). Вы можете поэкспериментировать с вкладкой оценки в keycloak, чтобы увидеть, как ресурс / область действия / политика / разрешения взаимодействуют друг с другом.

Мой подход к кодированию с использованием keycloak заключается в использовании отладки в реальной библиотеке keycloak-connect для пошагового выполнения авторизации.

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