来自 dockerized NuxtJS 应用程序的 Keycloak LDAP 身份验证

Keycloak LDAP authentication from a dockerized NuxtJS app

我在使用 Keycloak 进行身份验证时遇到问题。当我的 Nuxt 应用程序在本地 运行ning (npm 运行 dev) 时一切正常,但是当它在 Docker 容器中时,出现问题。

我有一个包含 Keycloak 和 Ldap 的 docker 服务:keycloak:8180 和 myad:10389。我的 Nuxt 应用程序 运行ning 在端口 3000 上。

在前端,这是我的配置,当我使用“npm 运行 dev”在本地启动我的应用程序时,它运行良好:

server: {
    port: 3000,
    host: '0.0.0.0'
},

...

auth: {
    strategies: {
      local: false,
      keycloak: {
        scheme: 'oauth2',
        endpoints: {
          authorization: 'http://localhost:8180/auth/realms/<realm>/protocol/openid-connect/auth',
          token: 'http://localhost:8180/auth/realms/<realm>/protocol/openid-connect/token',
          userInfo: 'http://localhost:8180/auth/realms/<realm>/protocol/openid-connect/userinfo',
          logout: 'http://localhost:8180/auth/realms/<realm>/protocol/openid-connect/logout?redirect_uri=' + encodeURIComponent('http://localhost:3000')
        },
        token: {
          property: 'access_token',
          type: 'Bearer',
          name: 'Authorization',
          maxAge: 300
        },
        refreshToken: {
          property: 'refresh_token',
          maxAge: 60 * 60 * 24 * 30
        },
        responseType: 'code',
        grantType: 'authorization_code',
        clientId: '<client_id>',
        scope: ['openid'],
        codeChallengeMethod: 'S256'
      }
    },
    redirect: {
      login: '/',
      logout: '/',
      home: '/home'
    }
  },

  router: {
    middleware: ['auth']
  }
}

这是我的 Keycloak 和 Nuxt docker-compose 配置:

  keycloak:
    image: quay.io/keycloak/keycloak:latest
    container_name: keycloak
    hostname: keycloak
    environment:
      - DB_VENDOR=***
      - DB_ADDR=***
      - DB_DATABASE=***
      - DB_USER=***
      - DB_SCHEMA=***
      - DB_PASSWORD=***
      - KEYCLOAK_USER=***
      - KEYCLOAK_PASSWORD=***
      - PROXY_ADDRESS_FORWARDING=true
    ports:
      - "8180:8080"
    networks:
      - ext_sd_bridge

    networks: 
        ext_sd_bridge:
            external:
                name: sd_bridge
    client_ui:
        image: ***
        container_name: client_ui
        hostname: client_ui
        ports:
            - "3000:3000"
        networks:
            - sd_bridge
    networks: 
        sd_bridge:
            name: sd_bridge

当我的 Nuxt 应用程序在其容器内时,身份验证似乎有效,但重定向行为很奇怪。如您所见,我总是在重定向到“/home”后被重定向到我的登录页面(“/”):

Browser network

我是不是遗漏了什么或者我做错了什么?

我知道我的问题是什么了。

所以基本上,我的 nuxt.config.js 在 Docker 容器内使用是错误的。我不得不将身份验证端点更改为:

endpoints: {
  authorization: '/auth/realms/MEDDATABOX/protocol/openid-connect/auth',
  token: '/auth/realms/MEDDATABOX/protocol/openid-connect/token',
  userInfo: '/auth/realms/MEDDATABOX/protocol/openid-connect/userinfo',
  logout: '/auth/realms/MEDDATABOX/protocol/openid-connect/logout?redirect_uri=' + encodeURIComponent('http://localhost:3000')
}

并将“/auth”请求代理到我的 Keycloak Docker 容器的主机名(请注意,我的 Keycloak 和 Nuxt 容器在我的 docker-compose 文件中位于同一网络中):

proxy: {
  '/auth': 'http://keycloak:8180'
}

此时,除“/authenticate”请求外,每个请求都工作正常,因为“keycloak:8180/authenticate”已放入浏览器URL,当然,它不知道“钥匙斗篷”。 为此,我将此环境变量添加到我的 Keycloak docker-compose :

KEYCLOAK_FRONTEND_URL=http://localhost:8180/auth

有了这个变量,authentication/redirection 的整个过程就像一个魅力一样工作,在他们的容器中有 Keycloak 和 Nuxt :)