使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)