使用 keycloak 提供程序从 next-auth 注销不起作用

Logout from next-auth with keycloak provider not works

我有一个带有 next-auth 的 nextjs 应用程序来管理身份验证。

这是我的配置

....
export default NextAuth({
  // Configure one or more authentication providers
  providers: [
    KeycloakProvider({
      id: 'my-keycloack-2',
      name: 'my-keycloack-2',
      clientId: process.env.NEXTAUTH_CLIENT_ID,
      clientSecret: process.env.NEXTAUTH_CLIENT_SECRET,
      issuer: process.env.NEXTAUTH_CLIENT_ISSUER,
      profile: (profile) => ({
        ...profile,
        id: profile.sub
      })
    })
  ],
....

身份验证按预期工作,但是当我尝试使用 next-auth signOut 功能注销时,它不起作用。 Next-auth 会话被破坏,但 keycloak 维护他的会话。

经过一些研究,我发现了描述相同问题的 reddit 对话 https://www.reddit.com/r/nextjs/comments/redv1r/nextauth_signout_does_not_end_keycloak_session/

这是我的解决方案。

我写了一个自定义函数来注销

  const logout = async (): Promise<void> => {
    const {
      data: { path }
    } = await axios.get('/api/auth/logout');
    await signOut({ redirect: false });
    window.location.href = path;
  };

并且我定义了一个api路径来获取销毁keycloak会话的路径/api/auth/logout

export default (req, res) => {
  const path = `${process.env.NEXTAUTH_CLIENT_ISSUER}/protocol/openid-connect/logout? 
                redirect_uri=${encodeURIComponent(process.env.NEXTAUTH_URL)}`;

  res.status(200).json({ path });
};