2

语境

大家好,我正在开发一个由 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 服务器提供给我的配置文件中没有这样的秘密......

我想没有你的帮助我不会走得更远,我整个星期都在浏览,尝试了很多线索,到目前为止没有运气......

感谢您的帮助,如果有的话,善良的陌生人......

4

0 回答 0