首页 > 解决方案 > 无法获取授权代码:错误:证书链中的自签名证书 - NodeJS 适配器 Keycloak

问题描述

我有用 nodeJS 编写的应用程序。我正在使用来自 npm 的 keycloak-connect 来使用 keycloak 登录。

当我想登录时,应用程序会将我重定向到 keycloak 网站,然后我输入登录详细信息,然后出现错误:

“无法获得授权代码:错误:证书链中的自签名证书” post-auth.js:58

我知道我可以使用process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;,但它不安全。我如何在 nodeJS / keycloak-adapter 中设置 CA 证书?

post-auth.js:

keycloak.getGrantFromCode(request.query.code, request, response)
      .then(grant => {
        let urlParts = {
          pathname: request.path,
          query: request.query
        };

        delete urlParts.query.code;
        delete urlParts.query.auth_callback;
        delete urlParts.query.state;
        delete urlParts.query.session_state;

        let cleanUrl = URL.format(urlParts);

        request.kauth.grant = grant;
        try {
          keycloak.authenticated(request);
        } catch (err) {
          console.log(err);
        }
        response.redirect(cleanUrl);
      }).catch((err) => {
        keycloak.accessDenied(request, response, next);
        console.error('Could not obtain grant code: ' + err);
      });

keycloak.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;
    
  var self = this;
  return this.grantManager.obtainFromCode(request, code, sessionId)
    .then(function (grant) {
      self.storeGrant(grant, request, response);
      return grant;
    });
};

标签: node.jsexpresssslkeycloakopenid-connect

解决方案


您应该通过将 NODE_EXTRA_CA_CERTS 环境变量配置为指向包含受信任的根权限的文件位置来在环境级别解决此问题。

我的博客文章对此有更多信息:

通常,您只需在部署管道的早期阶段(例如在开发人员 PC 上)进行此配置更改。当然,它不应该在生产环境中制作。


推荐阅读