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

如何在Node.js中实现无session的Keycloak JWT认证

Keycloak无会话JWT认证实现方案

核心修改逻辑

keycloak-connect 提供bearerOnly模式,开启后会完全跳过会话校验逻辑,直接解析请求中携带的JWT令牌完成认证,不需要依赖express-session组件。

实现步骤

1. 移除所有会话相关代码

删除express-session依赖引入、内存存储实例创建、会话中间件注册的全部代码。

2. 初始化Keycloak开启无会话模式

初始化Keycloak实例时不传入会话存储参数,新增bearerOnly: true配置。

3. 调整CORS配置(可选,跨域场景需要)

允许跨域请求携带Authorization头,避免前端请求令牌被拦截。

完整可运行代码

const express = require("express");
const keycloak = require("keycloak-connect");
const cors = require("cors");

const server = express();
const port = "80";

server.set("port", port);
server.use(express.json());
server.use(express.urlencoded({ extended: true }));
// 跨域场景需要放开Authorization头权限
server.use(cors({
  allowedHeaders: ["Content-Type", "Authorization"],
  exposedHeaders: ["Authorization"]
}));

// 初始化Keycloak,开启Bearer-only无会话模式
const KK = new keycloak({
  bearerOnly: true
  // 若不使用根目录的keycloak.json,可在此处传入第二个参数填写配置
  // }, {
  //   realm: "你的领域名称",
  //   "auth-server-url": "你的Keycloak服务地址",
  //   resource: "你的客户端ID",
  //   "bearer-only": true
});

server.use(KK.middleware({
  admin: "/admin",
  logout: "/"
}));

server.get("/private", KK.protect(), async (req, res, next) => {
  // 解析后的JWT载荷可直接从req.kauth对象获取
  res.json({
    message: "Hey! You're connected !",
    userInfo: req.kauth.grant.access_token.content
  });
});

server.get("/public", (req, res, next) => {
  res.json({ message: "This is the public page of the testing web app" });
});

server.listen(port, () => { console.log("Server running on port " + port) });

客户端请求方式

两种携带JWT的方式均被自动支持:

  • 请求头携带:请求头新增Authorization字段,值格式为Bearer 你的JWT令牌
  • Cookie携带:Cookie中新增KEYCLOAK_JWT字段,值为JWT令牌内容

注意:Bearer-only模式下不会自动重定向到Keycloak登录页,令牌无效或缺失时直接返回401状态码,完全适配接口服务无会话的认证需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:06:04