import { createActionURL } from "@auth/core" import { headers as nextHeaders } from "next/headers" import { NextRequest, NextResponse } from "next/server" import { AuthError } from "next-auth" import { Lang } from "@/constants/languages" import { env } from "@/env/server" import { internalServerError } from "@/server/errors/next" import { signOut } from "@/auth" export async function GET( request: NextRequest, context: { params: { lang: Lang } } ) { let redirectHeaders: Headers | undefined = undefined let redirectTo: string = "" // Clean up cookie from authRequired middleware redirectHeaders = new Headers() redirectHeaders.append( "set-cookie", "redirectTo=; Expires=Thu, 01 Jan 1970 00:00:00 UTC; Path=/; HttpOnly; SameSite=Lax" ) try { // Initiate the seamless logout flow let redirectUrlValue switch (context.params.lang) { case Lang.da: redirectUrlValue = env.SEAMLESS_LOGOUT_DA break case Lang.de: redirectUrlValue = env.SEAMLESS_LOGOUT_DE break case Lang.en: redirectUrlValue = env.SEAMLESS_LOGOUT_EN break case Lang.fi: redirectUrlValue = env.SEAMLESS_LOGOUT_FI break case Lang.no: redirectUrlValue = env.SEAMLESS_LOGOUT_NO break case Lang.sv: redirectUrlValue = env.SEAMLESS_LOGOUT_SV break } const redirectUrl = new URL(redirectUrlValue) if (request.nextUrl.searchParams.get("currentweb") != null) { // Request coming from NEW web, redirect to current web logout redirectTo = redirectUrl.toString() } else { // Request coming from CURRENT web, redirect to current web start page redirectTo = redirectUrl.origin } } catch (e) { console.error( "Unable to create URL for seamless logout, proceeding without it." ) console.error(e) } 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 */ console.log({ logout_NEXTAUTH_URL: process.env.NEXTAUTH_URL }) console.log({ logout_env: process.env }) console.log({ logout_redirectTo: redirectTo }) const headers = new Headers(nextHeaders()) const signOutURL = createActionURL( "signout", // @ts-expect-error `x-forwarded-proto` is not nullable, next.js sets it by default headers.get("x-forwarded-proto"), headers, process.env ) console.log({ logout_signOutURL: signOutURL }) const redirectUrlObj = await signOut({ redirectTo, redirect: false, }) if (redirectUrlObj) { return NextResponse.redirect(redirectUrlObj.redirect, { headers: redirectHeaders, }) } } catch (error) { if (error instanceof AuthError) { console.log({ signOutAuthError: error }) } else { console.log({ signOutError: error }) } } return internalServerError() }