如何使用基于 cookie 的 KeyCloak 身份验证设置 Node.js 服务器 - 现在获得无限重定向

Mar*_*ark 10 node.js keycloak

我正在设置一个受 KeyCloak 保护的 Node.js 服务器。这是我第一次使用 KeyCloak,我正在尝试各种用例。

我成功地实现了我使用express-sessionMemoryStore与公共客户端一起使用的场景。这是我的keycloak.json

{
  "realm": "keycloak-node-monolith",
  "auth-server-url": "http://localhost:8180/auth",
  "ssl-required": "external",
  "resource": "keycloak-node-monolith-public",
  "public-client": true,
  "confidential-port": 0
}
Run Code Online (Sandbox Code Playgroud)

这是我的工作服务器代码:

var session = require('express-session');
var Keycloak = require('keycloak-connect');
var express = require('express');

var app = express();

var memoryStore = new session.MemoryStore();

app.use(session({
  secret: 'uhlulululu',
  resave: false,
  saveUninitialized: true,
  store: memoryStore
}));

var keycloak = new Keycloak({ store: memoryStore });

app.use( keycloak.middleware());

app.get( '/check-sso', keycloak.checkSso(), (req, res) => {
    res.send('Check sso success');
});

app.get( '/protected', keycloak.protect(), (req, res) => {
   res.send('Protected content visible to you, because you are authenticated.');
});

app.listen(4000, '0.0.0.0', () => {console.log('App listening on port 3000');});
Run Code Online (Sandbox Code Playgroud)

我无法更改上述工作代码以使用 cookie 而不是 MemoryStore。

keycloak.json的和上面一样,它正在工作,所以我认为没有理由改变它。

我在我的代码中应用了以下更改:

  • 我用{ cookies: true }. 我非常有信心这是一个很好的举措,这将keycloak-connect使用内置的CookieStore.
  • 我添加cookieParser了使 cookie 可用。
  • 我尝试添加cookie-sessionor express-session,否则我会收到关于 missing 的错误session.id

这是我现在的代码:

var Keycloak = require('keycloak-connect');
var express = require('express');
var cookieSession = require('cookie-session');
var cookieParser = require('cookie-parser');
var session = require('express-session');

var app = express();

app.use(cookieParser('secret123'));

//app.use(session({
//  secret: 'secret123',
//  resave: false,
//  saveUninitialized: true,
//  cookie: {}
//));

app.use(cookieSession({
  name: 'session',
  secret: 'secret123',
  maxAge: 24 * 60 * 60 * 1000 // 24 hours
}));

//https://access.redhat.com/documentation/en-us/red_hat_single_sign-on/7.0/html-single/securing_applications_and_services_guide/index#applicationclustering
var keycloak = new Keycloak({ cookies: true });

app.use( keycloak.middleware());

app.get( '/check-sso', keycloak.checkSso(), (req, res) => {
    res.send('Check sso success');
});

app.get( '/protected', keycloak.protect(), (req, res) => {
   res.send('Protected content visible to you, because you are authenticated!');
});

app.listen(3000, '0.0.0.0', () => {console.log('App listening on port 3000');});
Run Code Online (Sandbox Code Playgroud)

当我访问时localhost:3000/protected,我被重定向到 KeyCloak 并且我可以成功进行身份验证。然后我被重定向到localhost:3000/protected,创建 Cookie 并传递到服务器。

身份验证后我看到的是一个无休止的重定向循环,如下所示: 在此处输入图片说明

我在网上阅读了很多资料,这个 repo https://github.com/v-ladyev/keycloak-nodejs-example/blob/master/lib/keyCloakService.js是一个基于 cookie 的无状态解决方案,但它重新实现了keycloak-connect.

keycloak-connect如果可能的话,我宁愿选择一个可以直接插入的简单解决方案。

任何帮助表示赞赏。