使用 keycloak-nodejs-connect 时出错 - "Cannot exchange code for grant in bearer-only mode"



我正在尝试实现一个Node.js客户端应用程序,该应用程序针对Keycapture进行身份验证,并使用外部IDP,使用keycapture nodejs连接器。我一直在使用这里的文档。

但是,在进行身份验证后,客户端应用程序会抛出错误:"无法在仅承载模式下交换代码以获得授权"。这让我很困惑,因为客户端没有配置为仅承载模式,而是配置为机密模式。

客户端应用程序成功地将我重定向到外部IDP,我可以在那里登录。如果我在Key斗篷管理控制台中查看,我也会在登录后看到自己的活动会话。然而,客户端应用程序仍然会抛出错误。

以下是我从Keycloft管理控制台获取的客户端配置:

{
"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文件中Node的实现:

var Keycloak = require('keycloak-connect');
let keycloakMiddleware = new Keycloak({idpHint: 'SSO'});
app.use( keycloakMiddleware.middleware() );
app.get( '/', keycloakMiddleware.protect(), complaintHandler);

我在与app.js相同的目录中有keyclock.json,它正在获取上面的客户端配置详细信息。

我遇到了同样的问题。我发现,在构建Keycloft实例时,必须将cookie设置为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解析器或类似的东西。据我所知,无论哪种方式,你都需要使用express会话。

app.use(require('cookie-parser')); // only if using cookies=true, i think
app.use(session({ secret }));
app.use(keycloakMiddleware.middleware());

最新更新