使用 keycloak-nodejs-connect 时出错 - “无法在仅承载模式下交换代码以获取授权”
Posted
技术标签:
【中文标题】使用 keycloak-nodejs-connect 时出错 - “无法在仅承载模式下交换代码以获取授权”【英文标题】:Error when using keycloak-nodejs-connect - "Cannot exchange code for grant in bearer-only mode" 【发布时间】:2019-07-07 21:22:40 【问题描述】:我正在尝试使用 keycloak-nodejs-connector 实现一个 Node.js 客户端应用程序,该应用程序针对 Keycloak 进行身份验证,并使用外部 IDP。我一直在关注位于here 的文档来使用它。
但是,在进行身份验证后,客户端应用程序会抛出错误:“Cannot exchange code for grant in bearer-only mode”。这让我很困惑,因为客户端没有配置为仅承载模式,而是配置为机密模式。
客户端应用程序成功地将我重定向到我可以登录的外部 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
这是我的 node.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 或类似的东西。无论哪种方式,据我所知,您都需要使用 express-session。
app.use(require('cookie-parser')); // only if using cookies=true, i think
app.use(session( secret ));
app.use(keycloakMiddleware.middleware());
【讨论】:
以上是关于使用 keycloak-nodejs-connect 时出错 - “无法在仅承载模式下交换代码以获取授权”的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)