From cd62f1589ff83fba7d62ffa2483017e9621d410e Mon Sep 17 00:00:00 2001 From: wood chen Date: Fri, 21 Feb 2025 22:42:54 +0800 Subject: [PATCH] feat: Enhance NextAuth session management with extended session duration and dynamic token updates --- src/auth.ts | 23 +++++++++++++++++++++-- src/components/layout/nav-bar.tsx | 9 +-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/auth.ts b/src/auth.ts index 310d3b0..d44dab4 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -7,7 +7,11 @@ import { prisma } from "./lib/prisma"; export const { handlers, auth, signIn, signOut } = NextAuth({ adapter: PrismaAdapter(prisma), - session: { strategy: "jwt" }, + session: { + strategy: "jwt", + maxAge: 30 * 24 * 60 * 60, // 30 days + updateAge: 24 * 60 * 60, // 24 hours + }, pages: { signIn: "/sign-in", }, @@ -42,7 +46,22 @@ export const { handlers, auth, signIn, signOut } = NextAuth({ session.user.name = token.name; return session; }, - async jwt({ token }) { + async jwt({ token, user, trigger, session }) { + if (trigger === "update" && session) { + // 当收到更新触发时,重新获取用户信息 + const dbUser = await getUserById(token.sub!); + if (dbUser) { + token.username = dbUser.username; + token.email = dbUser.email; + token.picture = dbUser.avatarUrl; + token.name = dbUser.name; + token.role = dbUser.role; + token.moderator = dbUser.moderator; + token.groups = dbUser.groups; + } + return token; + } + if (!token.sub) return token; const dbUser = await getUserById(token.sub); diff --git a/src/components/layout/nav-bar.tsx b/src/components/layout/nav-bar.tsx index 288ad7e..3229aa7 100644 --- a/src/components/layout/nav-bar.tsx +++ b/src/components/layout/nav-bar.tsx @@ -21,18 +21,11 @@ import { ThemeToggle } from "../theme-toggle"; import { Button } from "../ui/button"; export function NavBar() { - const { data: session, status, update } = useSession(); + const { data: session, status } = useSession(); const router = useRouter(); const pathname = usePathname(); const user = session?.user; - useEffect(() => { - // 当路由变化时,尝试更新 session - if (pathname === "/dashboard" || pathname.startsWith("/dashboard/")) { - update(); - } - }, [pathname, update]); - const handleSignOut = async () => { await signOut({ redirect: false }); router.refresh();