Ошибка при использовании keycloak-nodejs-connect - "Невозможно обменять код для предоставления в режиме только носителя"

Я пытаюсь реализовать клиентское приложение Node.js, аутентифицирующееся по Keycloak, и использующее внешний IDP, используя keycloak-nodejs-connector. Я следил за документацией, расположенной здесь, чтобы использовать это.

Однако после аутентификации клиентское приложение выдает ошибку: "Невозможно обменять код для предоставления в режиме только канала-носителя". Это сбивает с толку меня, потому что клиент не настроен для режима только канала-носителя, он настроен для конфиденциального режима.

Клиентское приложение успешно перенаправляет меня на внешний IDP, где я могу войти в систему. Если я загляну в консоль администратора Keycloak, я также увижу активный сеанс после входа в систему. Однако клиентское приложение по-прежнему выдает ошибку.

Вот моя конфигурация клиента, извлеченная из консоли администратора Keycloak:

{
"realm": "master",
"auth-server-url": "http://localhost:8080/auth",
"ssl-required": "external",
"resource": "local",
"verify-token-audience": true,
"credentials": {
    "secret": "redacted"
},
"use-resource-role-mappings": true,
"confidential-port": 0
}

Вот реализация в моем файле app.js для узла:

 var Keycloak = require('keycloak-connect');

 let keycloakMiddleware = new Keycloak({idpHint: 'SSO'});

 app.use( keycloakMiddleware.middleware() );

 app.get( '/', keycloakMiddleware.protect(), complaintHandler);

У меня есть keycloak.json в том же каталоге, что и app.js, и он собирает данные конфигурации клиента, описанные выше.

1 ответ

Я столкнулся с той же проблемой. Я понял, что при создании экземпляра Keycloak вы должны либо установить cookies=true, либо передать в хранилище сеансов. Итак, одно из этих:

      const session = require('express-session');
const store = new session.MemoryStore();
const keycloakMiddleware = new Keycloak({ idpHint: 'SSO', store });

или же

      const keycloakMiddleware = new Keycloak({ idpHint: 'SSO', cookies: true });

Если вы выберете последнее, вам также понадобится использовать cookie-parser или что-то в этом роде. И в любом случае, насколько я могу судить, вам нужно использовать экспресс-сессию.

      app.use(require('cookie-parser')); // only if using cookies=true, i think
app.use(session({ secret }));
app.use(keycloakMiddleware.middleware());
Другие вопросы по тегам