У меня есть приложение NextJs, использующее Msal 2 для аутентификации в AzureAD.
Работая локально или внутри dokcer-контейнера локально, он работает просто отлично, потому что порт контейнера 3000 перенаправляется непосредственно на хост 3000. Вход в систему и перенаправление на http://localhost:3000 не является проблемой в этом сценарии.
Теперь я развернул это в кластере Kubernetes в среде разработки / промежуточной разработки с самозаверяющим сертификатом и настраиваемым доменом, возникает одна проблема: он все еще хочет перенаправить обратно на http://localhost:3000
, хотя входной контроллер nginx указывает на https://machine.domain.eu
Текущая серия событий:
login.microsoftonline.com/...
http://localhost:3000/#code=xxxxxxx
Что должно произойти:
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
Есть ли крючок или другая точка входа для перехвата этого поведения? Если я удалю Uri перенаправления локального хоста из AzureAD, я даже не дойду до этого, поэтому мои подозрения прямо сейчас указывают на то, что next.js является виновником загрузки на локальном хосте: 3000 внутри контейнера.
Нет единой причины, по которой это не удалось в моей среде kubernetes.
Прежде всего, я установил navigateToLoginRequestUrl: true
, что означало, что если приложение запустится внутри localhost:3000
, оно будет перенаправлено именно на этот URL-адрес, когда придет ответ.
Это также означало, что установка любого значения redirectUri
не имела никакого эффекта.
Второй причиной, по которой это не удалось, был фактически мой манифест развертывания k8s, в котором указывалось, какой образ нужно извлечь, но не какая версия. После того, как я явно установил значение :latest
, мои изменения в коде сразу же вступили в силу.
Причина, которая привела меня на этот след, заключалась в исследовании стручков:
microk8s kubetl get pods
microk8s kubectl describe pod web-xxxx-xxxxxxx
Вот увидел картинку с дайджестом SHA в лайках registry/web@sha256-xxxxxx
Я сравнил это значение с самым последним изображением web
с docker images --digest
. Здесь я увидел, что у изображения с тегом latest
другой дайджест sha256-yyyyyy
Еда на вынос:
navigateToLoginRequestUrl
на false