You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak搭配Node.js实现角色认证时出现bearer-only模式授权码交换错误

问题根因与解决方案

你的配置存在多处冲突和错误,是触发bearer-only相关报错的直接原因,按以下步骤修复即可:

核心问题说明

  • 客户端类型配置冲突:你已经在Keycloak控制台将客户端设为confidential(机密)类型,但keycloak.json里显式配置了"public-client":true,会强制Keycloak Node.js适配器将客户端识别为公开类型,和控制台配置不匹配,触发授权逻辑异常。
  • 冗余配置干扰:grant_type不属于keycloak.json的标准配置字段,密码模式的授权类型是在调用登录接口时指定的,不需要写在初始化配置里,多余配置会干扰适配器的参数解析逻辑。
  • 缺失会话依赖:Keycloak Node.js适配器默认依赖会话存储用户认证状态,如果你没有提前配置express-session相关中间件,调用keycloak.protect()时会自动走无状态的bearer-only校验逻辑,和预期的用户名密码登录流程不匹配。
  • JSON语法错误:credentials配置中的secret值没有用引号包裹,会导致JSON解析失败。

修复步骤

1. 修正keycloak.json配置

删除冲突和冗余字段,修正后配置如下:

{
  "realm": "realm_name",
  "auth-server-url": "Keycloak_auth_url",
  "ssl-required": "none",
  "resource": "resource",
  "verify-token-audience": false,
  "credentials": {
    "secret": "secret_credentials"
  },
  "confidential-port": 0,
  "policy-enforcer": {},
  "scope": "openid"
}

2. 补充会话中间件配置

在初始化Keycloak实例、注册路由前,先配置express-session,示例代码:

const session = require('express-session');
const Keycloak = require('keycloak-connect');

const memoryStore = new session.MemoryStore();
app.use(session({
  secret: '自定义会话加密密钥',
  resave: false,
  saveUninitialized: true,
  store: memoryStore
}));

// 初始化Keycloak时传入会话存储
const keycloak = new Keycloak({ store: memoryStore });
app.use(keycloak.middleware());

3. 修正路由代码语法

你原路由代码缺了闭合括号和响应返回,修正后:

app.get("/", keycloak.protect(), function (req, res) {
  console.log(req);
  res.send('认证成功');
});

可选校验项

如果上述操作后仍有问题,检查Keycloak控制台对应客户端的配置:

  • 「有效重定向URI」已添加你Node.js服务的访问地址
  • 「Web源」已添加你Node.js服务的访问地址
  • 「直接访问授权」已开启(如果你用密码模式直接获取令牌)

内容的提问来源于stack exchange,提问作者Usman Haider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:57:01