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

如何在调用PostGraphile的Node.js服务中验证Keycloak Token

Keycloak Token校验无效问题修复方案

问题核心原因

  • PostGraphile路由未挂载Keycloak校验中间件,所有GraphQL请求直接放行
  • 错误使用keycloak.checkSso()而非keycloak.protect()做接口保护,checkSso()仅会解析有效token、不会拦截无效请求
  • 自定义路由未挂载到Express实例,测试代码完全未生效
  • 手动校验token时未去除Bearer 前缀,导致校验逻辑错误
  • 配置冗余:BearerOnly模式下不需要配置grantType字段

具体修复步骤

1. 修正keycloak-config.js配置

删除冗余的grantType配置,修改后核心配置如下:

var keycloakConfig = {
    clientId: 'type credential',
    bearerOnly: true,
    serverUrl: 'your company server address',
    realm: 'the test realm',
    credentials: {
        secret: 'your client secret'
    }
};

2. 修正Index.js依赖与中间件顺序

首先补全缺失的cors依赖导入,调整中间件顺序,给PostGraphile路由加Keycloak保护:

const express = require('express')
const bodyParser = require('body-parser')
const cors = require('cors') // 补全cors导入
const postgraphile = require('./postgraphile')
const app = express()

const keycloak = require('../config/keycloak-config').initKeycloak()
var router = express.Router();

app.set( 'trust proxy', true );
app.use(cors()); // cors要放在Keycloak中间件之前,避免跨域预检请求被拦截
app.use(keycloak.middleware());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// 给PostGraphile加保护,所有GraphQL请求必须携带有效token
app.use(keycloak.protect(), postgraphile);

// 挂载自定义路由
app.use(router);

// 测试路由改用protect做校验
app.get('/', keycloak.protect(), (req, res) => {
    res.send('success');
});

var server = app.listen(8080, () => console.log(`Server running on port ${8080}`));

3. 修正手动校验token的逻辑

去除Authorization头的Bearer 前缀后再做校验:

router.get('/verify',keycloak.protect(),function(req, res, next) {
    const authHeader = req.headers['authorization'];
    const token = authHeader ? authHeader.split(' ')[1] : null;
    console.log('提取的有效token:', token);

    try {
        let user = keycloak.jwt.verify(token);
        console.log('token是否过期:', user.isExpired());
        res.json({valid: true, userInfo: user.content})
    } catch (error) {
        console.error('token校验失败:', error);
        res.status(401).json({valid: false, msg: 'token无效'})
    }
})

验证方法

  1. 先测试/verify接口:携带无效token请求会返回401状态码,携带有效token才会返回校验成功信息
  2. 再测试PostGraphile的GraphQL接口:未携带token、携带过期/伪造token都会返回403错误,仅携带有效token可正常获取数据、执行mutation

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:15:01