Это первый раз, когда я спрашиваю что-то здесь, так что извините, если я забуду предоставить некоторую информацию или любые другие ошибки ..
Извините за текстовую стену.
Коротко, что я пытаюсь сделать
(может, я что-то не так понял):
Я создаю бэкэнд (только для 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 .
Любая помощь приветствуется:)