使用 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 });
};
我有一个带有 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 });
};