当 Keycloak 会话注销时,Next-Auth 保留自己的会话

问题描述 投票:0回答:2

我有一个带有 next-auth 的 nextjs 应用程序来管理 Keycloak 身份验证。 这是我的配置方式

const keycloak = KeycloakProvider({
    clientId: process.env.KEYCLOAK_ID,
    clientSecret: process.env.KEYCLOAK_SECRET,
    issuer: process.env.KEYCLOAK_ISSUER,
});

export const authOptions: NextAuthOptions = {
    secret: process.env.NEXTAUTH_SECRET,
    providers: [
        keycloak
    ],
    callbacks: {
        jwt: async({ token, account }) => {/*Extra logic for sign-out keycloak session*/}
    },
    events: {
        signOut: async({ token }) => {/*Extra logic for sign-out keycloak session*/}
    },
}

我可以成功登录和注销(对 keycloak 进行一些调整)。

问题:当我从管理面板中删除 Keycloak 会话时,Next-auth 不会检查它并保留它自己的会话。一旦 API 服务尝试验证来自 Keycloak 的令牌,验证就会失败,因为会话被丢弃。但 Next-auth 保持自己的会话有效。

有什么想法如何强制下一个身份验证来检查 Keycloak 会话是否仍然有效?

reactjs next.js single-sign-on keycloak next-auth
2个回答
2
投票

我找到了通过令牌轮换来控制此问题的解决方案

https://authjs.dev/guides/basics/refresh-token-rotation

还有一个特定于 Keycloak 的解决方案的链接,只是为了检查是否有任何问题

https://gist.github.com/degitgitagitya/db5c4385fc549f317eac64d8e5702f74

我还在身份验证时获取了

id_token
并在刷新令牌时重用它。需要
id_token
才能做到
Sign-out
。我已经使用了这个解决方案,在事件中触发额外的 keycloak 注销:

https://stackoverflow.com/a/75178127/7147231


0
投票

这是对我有用的代码:

    async function handleLogout() {
//    signOut('keycloak');
    await signOut({
      callbackUrl: "/api/auth/logout",
    });
  }

在/pages/api/auth/logout.ts中

export default (req, res) => {
    const logOutUrl = process.env.NEXT_PUBLIC_KEYCLOAK_DOMAIN + "/realms/" + process.env.NEXT_PUBLIC_REALM + "/protocol/openid-connect/logout?post_logout_redirect_uri=" + process.env.NEXT_PUBLIC_WEB_URL
+ "&client_id=" + process.env.NEXT_PUBLIC_CLIENTID

    res.redirect(logOutUrl);
  };

此解决方案来自 https://www.reddit.com/r/nextjs/comments/redv1r/nextauth_signout_does_not_end_keycloak_session/ - 归功于 doombubbles

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.