Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛 Check for new session first #1563

Merged
merged 2 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions apps/web/src/auth/edge/with-auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,22 @@ export const withAuth = (
middleware: (request: NextAuthRequest) => Promise<NextResponse>,
) => {
return async (request: NextAuthRequest) => {
let legacySession: Session | null = null;
let session: Session | null = null;

try {
legacySession = await getLegacySession();
session = await auth();
} catch (e) {
console.error(e);
}

let session = legacySession;
let isLegacySession = false;

if (!session) {
try {
session = await auth();
session = await getLegacySession();
if (session) {
isLegacySession = true;
}
} catch (e) {
console.error(e);
}
Expand All @@ -50,7 +53,7 @@ export const withAuth = (

const middlewareRes = await middleware(request);

if (legacySession) {
if (isLegacySession) {
try {
await migrateLegacyJWT(middlewareRes);
} catch (e) {
Expand Down
51 changes: 36 additions & 15 deletions apps/web/src/auth/legacy/next-auth-cookie-migration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { absoluteUrl } from "@rallly/utils/absolute-url";
import { cookies } from "next/headers";
import type { NextResponse } from "next/server";
import type { Session } from "next-auth";
import type { JWT } from "next-auth/jwt";
import { encode } from "next-auth/jwt";

import { decodeLegacyJWT } from "./helpers/jwt";
Expand All @@ -16,7 +17,7 @@ const newCookieName = prefix + "authjs.session-token";
export async function getLegacySession(): Promise<Session | null> {
const cookieStore = cookies();
const legacySessionCookie = cookieStore.get(oldCookieName);
if (legacySessionCookie) {
if (legacySessionCookie && legacySessionCookie.value) {
const decodedCookie = await decodeLegacyJWT(legacySessionCookie.value);

if (decodedCookie?.sub) {
Expand Down Expand Up @@ -45,26 +46,46 @@ async function getLegacyJWT() {
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
*/
export async function migrateLegacyJWT(res: NextResponse) {
const legacyJWT = await getLegacyJWT();

if (legacyJWT) {
const newJWT = await encode({
token: legacyJWT,
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);
await setNewSessionCookie(res, legacyJWT);
deleteLegacyCookie(res);
}
}
4 changes: 2 additions & 2 deletions apps/web/src/next-auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,12 +177,12 @@ const {
});

const auth = async () => {
const session = await getLegacySession();
const session = await originalAuth();
if (session) {
return session;
}

return originalAuth();
return getLegacySession();
};

export { auth, handlers, signIn, signOut };
Loading