KeyCloak-Nodejs – 返回授权码和状态后进入无限循环

我正在使用KeyCloak为虚拟节点应用程序设置Open Id连接。 我正在使用在关键斗篷文档中提到的nodejs适配器 。

以下是节点应用程序的routes.js文件:

'use strict'; /** * Module dependencies. */ const home = require('../app/controllers/home'); /** * Expose */ module.exports = function (app, passport) { var session = require('express-session'); var Keycloak = require('keycloak-connect'); var memoryStore = new session.MemoryStore(); var keycloak = new Keycloak({ store: memoryStore }) // app.use(session({ // secret: 'mySecret', // resave: false, // saveUninitialized: true, // store: memoryStore // })); app.use( keycloak.middleware() ); // console.log("In Routes.js. Compare with post auth message"); app.get('/', keycloak.protect(), home.index); // app.get('/redirect', keycloak.protect(), home.index); // app.get('/venky', keycloak.protect(), function(request, response) { // response.send("Hello World"); // }); app.get('/redirecta', home.index); /** * Error handling */ app.use(function (err, req, res, next) { // treat as 404 if (err.message && (~err.message.indexOf('not found') || (~err.message.indexOf('Cast to ObjectId failed')))) { return next(); } console.error(err.stack); // error page res.status(500).render('500', { error: err.stack }); }); // assume 404 since no middleware responded app.use(function (req, res, next) { res.status(404).render('404', { url: req.originalUrl, error: 'Not found' }); }); }; 

当我访问根url(本地主机:3000)最初我被redirect到keycloak上的login页面。 一旦我login,我得到以下错误: 在这里输入图像描述

这里是节点应用程序的服务器日志: 在这里输入图像描述

正如你所看到的,它可以进入无限循环。

其他细节我发现:

  1. 在login后的第一次redirect时,“状态”值与login前的值相同。从上面的服务器日志屏幕截图可以看出,之后的每个redirect都会更改状态值。

  2. 从我到目前为止已经发现的redirect发生在post-auth.js(行号49),导致无限循环。 这里是post-auth.js的链接 – https://github.com/keycloak/keycloak-nodejs-connect/blob/master/middleware/post-auth.js

  3. index.js中的getGrantFromCode函数中的sessionId是未定义的。 这是function:

 Keycloak.prototype.getGrantFromCode = function (code, request, response) { if (this.stores.length < 2) { // bearer-only, cannot do this; throw new Error('Cannot exchange code for grant in bearer-only mode'); } var sessionId = request.session.id; // console.log(sessionId, "BBB BEGIN NNNN - in index.js getGrantFromCode"); // console.log(request, "sessionId from getGrantFromCode function"); // console.log("EEE END DDD - in index.js getGrantFromCode"); var self = this; return this.grantManager.obtainFromCode(request, code, sessionId) .then(function (grant) { self.storeGrant(grant, request, response); // console.log(grant, "iS this the grant from getGrantFromCode?"); // console.log("Inside the return function of getGrantFromCode"); return grant; }); }; 

链接到源代码: https : //github.com/keycloak/keycloak-nodejs-connect/blob/master/index.js

  1. 以下是我在上面提到的授予function中logging的授予示例: https : //pastebin.com/eqUaiAvb

问题:

  1. 我该如何解决这个问题?
  2. 我在哪里可以findkeycloak日志(jboss)? 现在只有在出现错误时才能看到keycloak日志。 我正在使用mvn -f testsuite/integration/pom.xml exec:java -Pkeycloak-server来运行keycloak。 我以前从来没有在Java上工作过。
  3. id令牌的请求(使用授权码)发生在哪里?

非常感谢。