我有一个带有 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 会话是否仍然有效?
我找到了通过令牌轮换来控制此问题的解决方案
https://authjs.dev/guides/basics/refresh-token-rotation
还有一个特定于 Keycloak 的解决方案的链接,只是为了检查是否有任何问题
https://gist.github.com/degitgitagitya/db5c4385fc549f317eac64d8e5702f74
我还在身份验证时获取了
id_token
并在刷新令牌时重用它。需要id_token
才能做到Sign-out
。我已经使用了这个解决方案,在事件中触发额外的 keycloak 注销:
这是对我有用的代码:
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