我有一个带有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保留了他的会话。
2条答案
按热度按时间xvw2m8pv1#
经过一番研究,我发现一个reddit对话https://www.reddit.com/r/nextjs/comments/redv1r/nextauth_signout_does_not_end_keycloak_session/描述了同样的问题。
这是我的解决方案。
我编写了一个自定义函数来注销
我还定义了一个api路径,以获取销毁keycloak
/api/auth/logout
上的会话的路径在keycloak的最新版本中(在本文更新时是19. *. *-〉https://github.com/keycloak/keycloak-documentation/blob/main/securing_apps/topics/oidc/java/logout.adoc),重定向uri变得有点复杂
请注意,如果包含post_logout_redirect_uri,则需要包含client_id或id_token_hint参数。
6tdlim6h2#
所以,我有一个稍微不同的方法建立在这个线索上。
我并不喜欢应用程序中发生的所有重定向,也不喜欢仅仅为了处理“注销后握手”而在应用程序中添加新端点
相反,我将
id_token
直接添加到生成的初始JWT标记中,然后将一个名为doFinalSignoutHandshake
的方法附加到events.signOut
,该方法自动执行对keycloak服务端点的GET
请求,并代表用户终止会话。这种技术允许我维护应用程序中的所有当前流,并且仍然使用
next-auth
公开的标准signOut
方法,而无需在前端进行任何特殊的定制。这是用typescript编写的,因此我扩展了
JWT
定义以包含新值(在普通JS中不需要下面是我对
/pages/api/[...nextauth.ts]
的实现