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

Rav*_*apu 9 node.js express openid-connect keycloak

我正在使用KeyCloak虚拟节点应用程序设置Open Id connect .我正在使用key cloak docs中建议的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'
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

当我访问根URL时localhost:3000,我最初会被重定向到登录页面KeyCloak.登录后,我收到以下错误:在此输入图像描述

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

正如您所看到的,它将进入无限循环.

我发现的其他细节:

  1. 在第一次重定向中,登录后,该state值与登录前的值相同.从上面的服务器日志屏幕截图中可以看到,state此后每次重定向的值都会发生变化.

  2. 从我到目前为止所知,重定向正在post-auth.js (line number 49)导致无限循环.这是一个链接post-auth.js- https://github.com/keycloak/keycloak-nodejs-connect/blob/master/middleware/post-auth.js

  3. sessionIdgetGrantFromCode功能index.js 是不确定的.这是功能:

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;
    });
};
Run Code Online (Sandbox Code Playgroud)

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

  1. 以下是我在上述授权函数中记录时获得的示例授权:https: //pastebin.com/eqUaiAvb

问题:

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

非常感谢提前.

tyc*_*oon 3

  1. 要使代码正常工作,您需要取消注释会话初始化:

    // app.use(session({
    //       secret: 'mySecret',
    //       resave: false,
    //       saveUninitialized: true,
    //       store: memoryStore
    // }));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 由于您没有 java 经验,我建议使用docker 镜像作为 keycloak

    docker run -e KEYCLOAK_LOGLEVEL=DEBUG --name keycloak -p 8080:8080 jboss/keycloak
    
    Run Code Online (Sandbox Code Playgroud)

之后,您可以访问在端口8080上运行的keycloak,并且在控制台中您将看到keycloak日志

  1. 使用授权代码流时,所有令牌均从令牌端点返回。您可以在此处找到授权代码流程的详细说明。