diff --git a/.env.local.example b/.env.local.example
index c1e013b50..f24f3b573 100644
--- a/.env.local.example
+++ b/.env.local.example
@@ -25,4 +25,10 @@ SEAMLESS_LOGIN_EN="http://www.example.com/updatelogin"
SEAMLESS_LOGIN_FI="http://www.example.fi/updatelogin"
SEAMLESS_LOGIN_NO="http://www.example.no/updatelogin"
SEAMLESS_LOGIN_SV="http://www.example.se/updatelogin"
-WEBVIEW_ENCRYPTION_KEY="MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
+SEAMLESS_LOGOUT_DA="http://www.example.dk/updatelogout?newweb"
+SEAMLESS_LOGOUT_DE="http://www.example.de/updatelogout?newweb"
+SEAMLESS_LOGOUT_EN="http://www.example.com/updatelogout?newweb"
+SEAMLESS_LOGOUT_FI="http://www.example.fi/updatelogout?newweb"
+SEAMLESS_LOGOUT_NO="http://www.example.no/updatelogout?newweb"
+SEAMLESS_LOGOUT_SV="http://www.example.sv/updatelogout?newweb"
+WEBVIEW_ENCRYPTION_KEY="MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="
\ No newline at end of file
diff --git a/app/[lang]/(live)/(protected)/logout/route.ts b/app/[lang]/(live)/(protected)/logout/route.ts
index 336613db0..23ae2ffc0 100644
--- a/app/[lang]/(live)/(protected)/logout/route.ts
+++ b/app/[lang]/(live)/(protected)/logout/route.ts
@@ -1,32 +1,110 @@
+import { createActionURL } from "@auth/core"
+import { headers as nextHeaders } from "next/headers"
import { NextRequest, NextResponse } from "next/server"
import { AuthError } from "next-auth"
-import { badRequest } from "@/server/errors/next"
+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) {
+export async function GET(
+ request: NextRequest,
+ context: { params: { lang: Lang } }
+) {
+ let redirectHeaders: Headers | undefined = undefined
+ let redirectTo: string
+
const returnUrl = request.headers.get("x-returnurl")
- // If all else fails, always redirect to startpage
- const redirectTo =
- returnUrl ||
- request.nextUrl.searchParams.get("redirectTo") ||
- "/"
+ if (returnUrl) {
+ redirectTo = returnUrl
+ } else {
+ // Normal logout request from New web
+ redirectTo =
+ request.cookies.get("redirectTo")?.value || // Cookie gets set by authRequired middleware
+ request.nextUrl.searchParams.get("redirectTo") ||
+ "/"
+ // Make relative URL to absolute URL
+ if (redirectTo.startsWith("/")) {
+ if (!env.PUBLIC_URL) {
+ throw internalServerError("No value for env.PUBLIC_URL")
+ }
+ redirectTo = new URL(redirectTo, env.PUBLIC_URL).href
+ }
+ // 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)
+ redirectUrl.searchParams.set("returnurl", redirectTo)
+ redirectTo = redirectUrl.toString()
+ } 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
*/
- const obj = await signOut({
+ 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 (obj) {
- return NextResponse.redirect(obj.redirect)
+ if (redirectUrlObj) {
+ return NextResponse.redirect(redirectUrlObj.redirect, {
+ headers: redirectHeaders,
+ })
}
} catch (error) {
if (error instanceof AuthError) {
@@ -36,5 +114,5 @@ export async function GET(request: NextRequest) {
}
}
- return badRequest()
+ return internalServerError()
}
diff --git a/app/[lang]/(live)/(protected)/my-pages/[...path]/page.tsx b/app/[lang]/(live)/(protected)/my-pages/[...path]/page.tsx
index 3c1ce9f98..d8a292e62 100644
--- a/app/[lang]/(live)/(protected)/my-pages/[...path]/page.tsx
+++ b/app/[lang]/(live)/(protected)/my-pages/[...path]/page.tsx
@@ -20,7 +20,7 @@ export default async function MyPages({