我正在尝试实现一个Node.js客户端应用程序,通过keycloak-nodejs-connector对Keycloak进行身份验证,并使用外部IDP。我一直在遵循位于here的文档来使用它。
但是,在身份验证之后,客户端应用程序抛出错误:“无法在仅限持有者模式下用代码交换授权”。这让我感到困惑,因为客户端没有配置为仅承载模式,而是配置为保密模式。
客户端应用程序成功地将我重定向到我能够登录的外部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文件中Node的实现:
var Keycloak = require('keycloak-connect');
let keycloakMiddleware = new Keycloak({idpHint: 'SSO'});
app.use( keycloakMiddleware.middleware() );
app.get( '/', keycloakMiddleware.protect(), complaintHandler);我在与app.js相同的目录中有keycloak.json,它正在获取上面的客户端配置详细信息。
发布于 2021-07-23 00:31:07
我遇到了同样的问题。我想的是,在构造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解析器或类似的工具。无论哪种方式,据我所知,您都需要使用express-session。
app.use(require('cookie-parser')); // only if using cookies=true, i think
app.use(session({ secret }));
app.use(keycloakMiddleware.middleware());https://stackoverflow.com/questions/54680422
复制相似问题