msal.js 重定向到 kubernetes 中的本地主机

msal.js redirects to localhost inside kubernetes

我有一个使用 Msal 2 的 NextJs 应用程序,用于通过 AzureAD 进行身份验证。

在本地工作或在本地的 dokcer-container 内部工作它工作得很好,因为容器端口 3000 直接转发到主机 3000。登录并重定向到 http://localhost:3000 是非-在那种情况下的问题。

现在我已经将它部署到一个 Kubernetes 集群到一个具有自签名证书和自定义域的 dev/staging 环境中,出现了一个问题:它仍然想重定向回 http://localhost:3000,尽管 nginx 入口控制器指向 https://machine.domain.eu

当前系列事件是:

  1. 打开url
  2. 自动打开验证弹窗
  3. 弹出窗口重定向到 login.microsoftonline.com/...
  4. flow 尝试重定向回 http://localhost:3000/#code=xxxxxxx

应该发生的是:

  1. 重定向回 https://machine.domain.eu

当前的 msal 配置如下所示:

export const msalConfig = {
    auth: {
        clientId: "611c5aa6-f7de-4a06-ace7-xxxxxxxxxx",
        authority: "https://login.microsoftonline.com/291d05b0-1020-4f36-aac5-xxxxxxxxxxx",
        redirectUri: process.env.HOSTNAME || "http://localhost:3000",            navigateToLoginRequestUrl: true
    },
    cache: {
        cacheLocation: "localStorage", // This configures where your cache will be stored
        storeAuthStateInCookie: false // Set this to "true" if you are having issues on IE11 or Edge
    },
}

process.env.HOSTNAME 作为清单中的变量通过构建管道动态提供:

spec:
  hostname: web-dev
  containers:
    - name: web 
      image: localhost:32000/web
      env:
      - name: NODE_TLS_REJECT_UNAUTHORIZED
        value: "0"
      - name: BASE_PATH
        value: '/dev'
      - name: HOSTNAME
        value: 'https://machine.domain.eu'
      ports:
      - containerPort: 3000

是否有钩子或其他入口点来拦截此行为? 如果我从 AzureAD 中删除本地主机重定向 Uri,我什至没有走那么远,所以我现在怀疑 next.js 是在容器内 localhost:3000 上启动的罪魁祸首。

在我的 kubernetes 环境中失败的原因并不单一。

首先,我设置了 navigateToLoginRequestUrl: true,这意味着,如果应用程序在 localhost:3000 内部启动,它会在响应通过时重定向到这个确切的 url。

这也意味着,将任何值设置为 redirectUri 都没有效果。

失败的第二个原因实际上是我的 k8s 部署清单,它指定了要拉取的图像,但没有指定哪个版本。将其显式设置为 :latest 后,我对代码的更改立即生效。

让我走上这条路的原因是调查 pods:

microk8s kubetl get pods
microk8s kubectl describe pod web-xxxx-xxxxxxx

在这里我看到了一张带有 SHA 摘要的图片,喜欢 registry/web@sha256-xxxxxx

我将此值与 webdocker images --digest 的最新图像进行了比较。在这里我看到,用 latest 标记的图像有不同的摘要 sha256-yyyyyy

外卖:

  1. 如果响应url与requestUrl不同,设置navigateToLoginRequestUrlfalse
  2. 请确保,您认为构建容器的图像实际上是您认为的图像。