From ca7afd3eb8923635d117de23c8ed68072a56ae27 Mon Sep 17 00:00:00 2001 From: Michael Zetterberg Date: Wed, 17 Apr 2024 09:30:04 +0200 Subject: [PATCH] feat: logout endpoint --- app/[lang]/(live)/(protected)/logout/route.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 app/[lang]/(live)/(protected)/logout/route.ts diff --git a/app/[lang]/(live)/(protected)/logout/route.ts b/app/[lang]/(live)/(protected)/logout/route.ts new file mode 100644 index 000000000..91fb4081d --- /dev/null +++ b/app/[lang]/(live)/(protected)/logout/route.ts @@ -0,0 +1,41 @@ +import { NextRequest, NextResponse } from "next/server" +import { AuthError } from "next-auth" + +import { signOut } from "@/auth" +import { badRequest } from "@/server/errors/next" + +export async function GET(request: NextRequest) { + const returnUrl = request.headers.get("x-returnurl") + + // If all else fails, always redirect to startpage + const redirectTo = + returnUrl || + request.headers.get("x-redirect-to") || + request.nextUrl.searchParams.get("redirectTo") || + request.headers.get("Referer") || + "/" + + try { + /** + * Passing `redirect: false` to `signOut` will return a result object + * instead of automatically redirecting inside of `signOut`. + * https://github.com/nextauthjs/next-auth/blob/3c035ec/packages/next-auth/src/lib/actions.ts#L104 + */ + const obj = await signOut({ + redirectTo, + redirect: false, + }) + + if (obj) { + return NextResponse.redirect(obj.redirect) + } + } catch (error) { + if (error instanceof AuthError) { + console.log({ signOutAuthError: error }) + } else { + console.log({ signOutError: error }) + } + } + + return badRequest() +}