如何在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
相关产品推荐
相关产品推荐

