🐛 Check for new session first (#1563)

This commit is contained in:
Luke Vella 2025-02-13 10:58:25 +07:00 committed by GitHub
parent ff4a1d16cb
commit 6979c091f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 46 additions and 22 deletions

View file

@ -15,19 +15,22 @@ export const withAuth = (
middleware: (request: NextAuthRequest) => Promise<NextResponse>, middleware: (request: NextAuthRequest) => Promise<NextResponse>,
) => { ) => {
return async (request: NextAuthRequest) => { return async (request: NextAuthRequest) => {
let legacySession: Session | null = null; let session: Session | null = null;
try { try {
legacySession = await getLegacySession(); session = await auth();
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
let session = legacySession; let isLegacySession = false;
if (!session) { if (!session) {
try { try {
session = await auth(); session = await getLegacySession();
if (session) {
isLegacySession = true;
}
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
@ -50,7 +53,7 @@ export const withAuth = (
const middlewareRes = await middleware(request); const middlewareRes = await middleware(request);
if (legacySession) { if (isLegacySession) {
try { try {
await migrateLegacyJWT(middlewareRes); await migrateLegacyJWT(middlewareRes);
} catch (e) { } catch (e) {

View file

@ -2,6 +2,7 @@ import { absoluteUrl } from "@rallly/utils/absolute-url";
import { cookies } from "next/headers"; import { cookies } from "next/headers";
import type { NextResponse } from "next/server"; import type { NextResponse } from "next/server";
import type { Session } from "next-auth"; import type { Session } from "next-auth";
import type { JWT } from "next-auth/jwt";
import { encode } from "next-auth/jwt"; import { encode } from "next-auth/jwt";
import { decodeLegacyJWT } from "./helpers/jwt"; import { decodeLegacyJWT } from "./helpers/jwt";
@ -16,7 +17,7 @@ const newCookieName = prefix + "authjs.session-token";
export async function getLegacySession(): Promise<Session | null> { export async function getLegacySession(): Promise<Session | null> {
const cookieStore = cookies(); const cookieStore = cookies();
const legacySessionCookie = cookieStore.get(oldCookieName); const legacySessionCookie = cookieStore.get(oldCookieName);
if (legacySessionCookie) { if (legacySessionCookie && legacySessionCookie.value) {
const decodedCookie = await decodeLegacyJWT(legacySessionCookie.value); const decodedCookie = await decodeLegacyJWT(legacySessionCookie.value);
if (decodedCookie?.sub) { if (decodedCookie?.sub) {
@ -45,6 +46,38 @@ async function getLegacyJWT() {
return null; return null;
} }
function deleteLegacyCookie(res: NextResponse) {
const cookieStore = cookies();
const oldCookie = cookieStore.get(oldCookieName);
if (oldCookie) {
// Delete the old cookie
res.cookies.set(oldCookieName, oldCookie.value, {
httpOnly: true,
secure: isSecureCookie,
expires: new Date(0),
sameSite: "lax",
path: "/",
});
}
}
async function setNewSessionCookie(res: NextResponse, jwt: JWT) {
const newJWT = await encode({
token: jwt,
secret: process.env.SECRET_PASSWORD,
salt: newCookieName,
});
// Set new session cookie
res.cookies.set(newCookieName, newJWT, {
httpOnly: true,
secure: isSecureCookie,
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7),
sameSite: "lax",
path: "/",
});
}
/** /**
* Replace the old legacy cookie with the new one * Replace the old legacy cookie with the new one
*/ */
@ -52,19 +85,7 @@ export async function migrateLegacyJWT(res: NextResponse) {
const legacyJWT = await getLegacyJWT(); const legacyJWT = await getLegacyJWT();
if (legacyJWT) { if (legacyJWT) {
const newJWT = await encode({ await setNewSessionCookie(res, legacyJWT);
token: legacyJWT, deleteLegacyCookie(res);
secret: process.env.SECRET_PASSWORD,
salt: newCookieName,
});
res.cookies.set(newCookieName, newJWT, {
httpOnly: true,
secure: isSecureCookie,
expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7),
sameSite: "lax",
path: "/",
});
res.cookies.delete(oldCookieName);
} }
} }

View file

@ -177,12 +177,12 @@ const {
}); });
const auth = async () => { const auth = async () => {
const session = await getLegacySession(); const session = await originalAuth();
if (session) { if (session) {
return session; return session;
} }
return originalAuth(); return getLegacySession();
}; };
export { auth, handlers, signIn, signOut }; export { auth, handlers, signIn, signOut };