82 lines
2.8 KiB
TypeScript
82 lines
2.8 KiB
TypeScript
import type { APIRoute } from "astro";
|
|
|
|
// Mark this endpoint as server-rendered, not static
|
|
export const prerender = false;
|
|
|
|
export const GET: APIRoute = async ({ request, redirect }) => {
|
|
try {
|
|
// Get the Logto endpoint and client ID from environment variables
|
|
const logtoEndpoint = import.meta.env.LOGTO_ENDPOINT;
|
|
const clientId = import.meta.env.LOGTO_POCKETBASE_APP_ID;
|
|
|
|
if (!logtoEndpoint) {
|
|
throw new Error("LOGTO_ENDPOINT environment variable is not set");
|
|
}
|
|
|
|
if (!clientId) {
|
|
throw new Error(
|
|
"LOGTO_POCKETBASE_APP_ID environment variable is not set",
|
|
);
|
|
}
|
|
|
|
// Get the current origin to use as the redirect URL
|
|
const url = new URL(request.url);
|
|
const origin = url.origin;
|
|
|
|
// Construct the redirect URL (back to dashboard)
|
|
const redirectUrl = `${origin}/dashboard`;
|
|
|
|
// Log the redirect URL for debugging
|
|
console.log(`Setting post-logout redirect to: ${redirectUrl}`);
|
|
console.log(`Using client ID: ${clientId}`);
|
|
|
|
// Make a POST request to the Logto session end endpoint with the redirect in the body
|
|
const logoutUrl = `${logtoEndpoint}/oidc/session/end`;
|
|
|
|
console.log(`Using Logto endpoint: ${logtoEndpoint}`);
|
|
console.log(`Full logout URL: ${logoutUrl}`);
|
|
|
|
try {
|
|
// Try to make a POST request with the redirect in the body and client ID
|
|
const response = await fetch(logoutUrl, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
},
|
|
body: new URLSearchParams({
|
|
post_logout_redirect_uri: redirectUrl,
|
|
client_id: clientId,
|
|
}),
|
|
redirect: "manual", // Don't automatically follow redirects
|
|
});
|
|
|
|
// If we get a redirect response, follow it
|
|
if (response.status >= 300 && response.status < 400) {
|
|
const location = response.headers.get("Location");
|
|
if (location) {
|
|
console.log(`Received redirect to: ${location}`);
|
|
return redirect(location);
|
|
}
|
|
}
|
|
|
|
// If POST doesn't work, fall back to the query parameter approach
|
|
console.log(
|
|
"POST request didn't result in expected redirect, falling back to GET",
|
|
);
|
|
return redirect(
|
|
`${logoutUrl}?post_logout_redirect_uri=${encodeURIComponent(redirectUrl)}&client_id=${encodeURIComponent(clientId)}`,
|
|
);
|
|
} catch (fetchError) {
|
|
console.error("Error making POST request to Logto:", fetchError);
|
|
// Fall back to the query parameter approach
|
|
return redirect(
|
|
`${logoutUrl}?post_logout_redirect_uri=${encodeURIComponent(redirectUrl)}&client_id=${encodeURIComponent(clientId)}`,
|
|
);
|
|
}
|
|
} catch (error) {
|
|
console.error("Error in logout API:", error);
|
|
|
|
// If there's an error, redirect to dashboard anyway
|
|
return redirect("/dashboard");
|
|
}
|
|
};
|