如何在调用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无效'}) } })
验证方法
- 先测试
/verify接口:携带无效token请求会返回401状态码,携带有效token才会返回校验成功信息 - 再测试PostGraphile的GraphQL接口:未携带token、携带过期/伪造token都会返回403错误,仅携带有效token可正常获取数据、执行mutation
内容的提问来源于stack exchange,提问作者lschaves
相关产品推荐
相关产品推荐

