带密钥斗篷的 Nuxt 身份验证:ssr this.$auth.loggedIn 在页面加载时始终为 false

Nuxt auth with keycloak: ssr this.$auth.loggedIn always false on page load

我有一个使用 nuxt 和 keycloak 作为身份验证策略的设置,通常可以正常工作。我可以通过 keycloak 登录,然后页面上会有 this.$auth.loggedIn === true。通过 vue-router 导航时,切换到新页面时 this.$auth.loggedIn 也将为真。

但是当我重新加载页面 (CMD+r/F5) 时,服务器端呈现 false this.$auth.loggedIn,而在客户端呈现 true .这迫使我在模板中做很多 <client-only> 块以防止 ssr 不匹配。

我想知道是否有可能在第一个页面加载服务器端渲染 return 一个具有授权内容的页面?我认为这应该是可能的,因为带有身份验证信息的 cookie 已设置并发送到服务器。 或者永远不可能和高效的服务器端渲染只能用于非授权内容?

版本:

nuxt.config.js:

auth: {
  strategies: {
    keycloak: {
      scheme: 'oauth2',
      endpoints: {
        authorization: `${ process.env.KEYCLOAK }/protocol/openid-connect/auth`,
        userInfo: `${ process.env.KEYCLOAK }/protocol/openid-connect/userinfo`,
        token: `${ process.env.KEYCLOAK }/protocol/openid-connect/token`,
        logout: `${ process.env.KEYCLOAK }/protocol/openid-connect/logout`,
      },
      token: {
        property: 'access_token',
        type: 'Bearer',
        maxAge: 1800,
      },
      refreshToken: {
        property: 'refresh_token',
        maxAge: 60 * 60 * 24 * 30,
      },
      responseType: 'code',
      grantType: 'authorization_code',
      clientId: process.env.CLIENT_ID,
      scope: ['openid', 'profile', 'email', 'roles'],
      codeChallengeMethod: 'S256',
      redirect: {
        logout: '/',
        callback: '/',
        home: '/',
      },
    },
  },
},

有一个 Vue 组件:

created() {
  console.log(this.$auth.loggedIn);
},

登录后将 return false 用于 SSR,true 在客户端 load/refresh 页。

手动实施服务器端验证器后,我发现问题出在我的本地 docker 设置上。

之前没想到是这个问题,所以忘记提了。 我有一个带有 keycloak 的本地 docker 容器和一个带有 nuxt 的本地 docker 容器。

长话短说,似乎 nuxt 服务器无法与 keycloak 通信,因此无法获取用户。在更改了一些地址后,keycloak 在浏览器和我的 nuxt 服务器 docker 容器中的相同地址上可用,nuxt 服务器确实在页面加载时自动获得 $auth.loggedIn=true 如果是已登录。

不确定我是否没有看到它,但我希望如果 nuxt 服务器无法与授权服务器通信,nuxt auth 会给我一个错误。会节省我很多调试时间。