我试图通过Keycloak-nodejs-connector实现针对Keycloak进行身份验证的Node.js客户端应用程序,并使用外部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,它正在获取上述客户端配置详细信息。
答案 0 :(得分:0)
我遇到了同样的问题。我发现在构建 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 或类似的东西。无论哪种方式,据我所知,您都需要使用 express-session。
app.use(require('cookie-parser')); // only if using cookies=true, i think
app.use(session({ secret }));
app.use(keycloakMiddleware.middleware());