语境
大家好,我正在开发一个由 3 部分组成的应用程序:
- 用于身份验证的 Keycloak 服务器
- 前端的 Angular 应用程序(带有专用客户端,公共)
- 后端的快速路由器(带有专用客户端,仅限承载)
前两部分就像一个魅力,我可以使用我的 Angular 应用程序对我的 KC 服务器进行身份验证,获取角色,等等。
本周,我开始使用后端,按照官方文档等安装 keycloak-connect,以解决我当前的问题。
这是我正在尝试的精简代码:
var express = require('express');
var session = require('express-session');
var Keycloak = require('keycloak-connect');
var memoryStore = new session.MemoryStore();
var keycloak = new Keycloak({ store: memoryStore });
var app = express();
//session
app.use(session({
secret:'thisShouldBeLongAndSecret',
resave: false,
saveUninitialized: true,
store: memoryStore
}));
app.use( keycloak.middleware() );
app.get('/check', keycloak.checksso('user'), function(req, res){
console.log(req.headers);
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ 'this': 'works!' }, null, 3));
});
app.get('/check', keycloak.enforce('user'), function(req, res){
console.log(req.headers);
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({ 'this': 'does not work' }, null, 3));
});
app.listen(8000, function () {
console.log('Listening at http://localhost:8000');
});
在我设置了仅承载客户端之后,我的 KC 服务器提供了一个 .json 文件,所以这个应该没问题。
问题
请注意,使用 .checkSSO() 可以按预期工作,而使用 protect('my-role') 或 enforce('my-role') 则不能。
我的快递后端正确获得了 Angular 令牌,我使用https://www.jstoolset.com/jwt服务检查了角色 my-role ,一切都很好。
我在我的 KC 服务器上启用了 LOGLEVEL,使用protect() 我什么也没得到,但我使用enforce() 确实收到了一条消息:
keycloak-connect : type=PERMISSION_TOKEN_ERROR, userId=null, ipAddress=, error=invalid_client_credentials
这对我来说很奇怪,因为我用于后端的专用客户端被配置为仅承载,并且在我的 KC 服务器提供给我的配置文件中没有这样的秘密......
我想没有你的帮助我不会走得更远,我整个星期都在浏览,尝试了很多线索,到目前为止没有运气......
感谢您的帮助,如果有的话,善良的陌生人......