keycloak-connect nodejs / meteor - 仅在首次登录时拒绝访问且仅在 prod

Posted

技术标签:

【中文标题】keycloak-connect nodejs / meteor - 仅在首次登录时拒绝访问且仅在 prod【英文标题】:keycloak-connect nodejs / meteor - Getting access denied at first login only and prod only 【发布时间】:2021-11-01 20:22:21 【问题描述】:

我有一个流星/nodeJs 应用程序,需要连接到我的客户端进行身份验证。我这样设置了一个连接访问点(我只是匿名了各种值):

import Keycloak from "keycloak-connect";
import  WebApp  from "meteor/webapp";
import express from "express";
import session from "express-session";

const app = express();
const memoryStore = new session.MemoryStore();

app.use(
  session(
    secret: "secret",
    resave: false,
    saveUninitialized: true,
    store: memoryStore,
  )
);

const kcConfig = 
  clientId: "clientId",
  serverUrl: "realmUrl",
  realm: "clientName",
  realmPublicKey: "publicKey",
;

const keycloak = new Keycloak( store: memoryStore , kcConfig);
app.use(keycloak.middleware());

app.get("/connect", keycloak.protect(), (req, res) => 
// doing my stuff here
  res.writeHead(301, 
    Location: "/connected",
  );
  res.end();
);

WebApp.connectHandlers.use(app);

问题是:

当我在本地运行服务器并转到 /connect 链接时,我被重定向到连接平台。我连接并被发送回我的 localhost:3000/connected => 一切都按预期工作 当我在生产环境中执行完全相同的流程时,我在第一次尝试登录后收到拒绝访问(仅写入拒绝访问的空白页面)。如果我随后手动返回 /connect 链接,我将直接连接(我想我正确获取了令牌并可以再次连接)

我不知道为什么这两种环境的行为不同,以及为什么我在生产时收到拒绝访问页面。

【问题讨论】:

我的第一个猜测是您的 ROOT_URL 可能是错误的。你已经检查过了吗? @ChristianFritz ROOT_URL 已设置,末尾有斜杠,但我认为这不是问题,尽管我会尝试不使用它。不知道为什么它会在您第二次访问该 URL 时起作用。 什么会导致访问被拒绝以及该页面的 url 是什么? @ChristianFritz 你实际上是对的,非常感谢,似乎是尾部斜杠导致了错误......非常感谢,如果你愿意,你可以发布答案,我会接受它 【参考方案1】:

正如 cmets 中提到的,我的 ROOT_URL 有问题,留下了一个斜杠。去掉之后就好多了。

【讨论】:

以上是关于keycloak-connect nodejs / meteor - 仅在首次登录时拒绝访问且仅在 prod的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NodeJS 中自定义 keycloak 错误消息

如何配置 keycloak-(nodejs-)connect 以使用 PKCE?

Keycloak - 授权验证失败。原因:无效令牌(错误的 ISS)

Node.js API 受 Keycloak 保护,访问类型为“仅承载”

如何使用 keycloak 对 loopback 4 应用程序进行身份验证

Keycloak Node.js 适配器在公司代理后面不起作用