I have a project configured with output: "server", so everything is ssg and everything is working just fine. I have added a dynamic route as /preloads/[id].astro and that is ssr. It seems that there is no access to Astro.locals in that page and it seems I am not doing it right to protect that route. This is my middleware code:
import { defineMiddleware } from "astro:middleware";
import { supabase } from "../lib/supabase";
import micromatch from "micromatch";
const protectedRoutes = [
"/(|/)",
"/arreglos(|/)",
"/para-empezar(|/)",
"/preloads/*(|/)",
];
const redirectRoutes = ["/signin(|/)", "/register(|/)"];
export const onRequest = defineMiddleware(
async ({ locals, url, cookies, redirect }, next) => {
if (micromatch.isMatch(url.pathname, protectedRoutes)) {
const accessToken = cookies.get("sb-access-token");
const refreshToken = cookies.get("sb-refresh-token");
if (!accessToken || !refreshToken) {
return redirect("/signin");
}
const { data, error } = await supabase.auth.setSession({
refresh_token: refreshToken.value,
access_token: accessToken.value,
});
if (error) {
cookies.delete("sb-access-token", {
path: "/",
});
cookies.delete("sb-refresh-token", {
path: "/",
});
return redirect("/signin");
}
locals.id = data.user?.id!;
cookies.set("sb-access-token", data?.session?.access_token!, {
sameSite: "strict",
path: "/",
secure: true,
});
cookies.set("sb-refresh-token", data?.session?.refresh_token!, {
sameSite: "strict",
path: "/",
secure: true,
});
}
if (micromatch.isMatch(url.pathname, redirectRoutes)) {
const accessToken = cookies.get("sb-access-token");
const refreshToken = cookies.get("sb-refresh-token");
if (accessToken && refreshToken) {
return redirect("/");
}
}
return next();
},
);