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

在Node.js/Express.js中自定义中间件集成Keycloak.protect()的需求

实现自定义Keycloak认证标识中间件

思路说明

  • 放弃keycloak.protect()的强制拦截逻辑,改为在中间件里检查用户认证状态但不阻断请求
  • 在请求对象上添加自定义标识,让后续处理函数能根据这个标识返回对应数据量

编写verifytoken中间件

假设你已完成Keycloak基础配置,有可用的keycloak实例,直接编写中间件:

const verifytoken = async (req, res, next) => {
  try {
    // 从请求头提取Bearer令牌
    const token = req.headers.authorization?.split(' ')[1];
    if (token) {
      // 用Keycloak工具验证令牌有效性
      await keycloak.grantManager.validateAccessToken(token);
      req.isAuthenticated = true; // 标记为已认证
    } else {
      req.isAuthenticated = false; // 无令牌,标记未认证
    }
  } catch (err) {
    // 令牌无效或验证失败,标记未认证
    req.isAuthenticated = false;
  }
  // 无论认证结果如何,放行到下一个处理函数
  next();
};

路由配置

保持你原有的路由写法即可:

router.get('/v1/endpoint', verifytoken, apis.getData);

修改getData处理逻辑

在apis.getData中根据中间件添加的标识返回对应数据:

// apis.js中的getData函数
exports.getData = (req, res) => {
  if (req.isAuthenticated) {
    // 已认证用户返回完整数据
    return res.status(200).json({
      code: 200,
      data: ['完整数据项1', '完整数据项2', '完整数据项3'],
      message: '已认证用户'
    });
  } else {
    // 未认证用户返回精简数据
    return res.status(200).json({
      code: 200,
      data: ['精简数据项1'],
      message: '未认证用户'
    });
  }
};

注意点

  • 中间件必须捕获所有验证错误,避免验证失败时请求被阻断,确保符合“无论认证与否都进入处理函数”的需求
  • 标识字段可自定义命名,比如req.authStatus或req.hasValidToken,只要前后保持一致即可
  • 如果需要获取用户详细信息,可在验证通过后将用户信息挂载到req.user上,供后续逻辑使用

内容的提问来源于stack exchange,提问作者undefined-2493

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:20:52