Files
codey.lol/src/hooks/requireAuthHook.js

50 lines
1.3 KiB
JavaScript
Raw Normal View History

2025-08-28 11:15:17 -04:00
// requireAuthHook.js
import { API_URL } from "@/config";
2025-08-28 11:15:17 -04:00
export const requireAuthHook = async (Astro) => {
try {
2025-08-28 11:15:17 -04:00
const cookieHeader = Astro.request.headers.get("cookie") ?? "";
let res = await fetch(`${API_URL}/auth/id`, {
headers: { Cookie: cookieHeader },
credentials: "include",
});
if (res.status === 401) {
const refreshRes = await fetch(`${API_URL}/auth/refresh`, {
method: "POST",
headers: { Cookie: cookieHeader },
credentials: "include",
});
if (!refreshRes.ok) {
return null;
}
2025-08-28 11:15:17 -04:00
const setCookieHeader = refreshRes.headers.get("set-cookie");
let newCookieHeader = cookieHeader;
2025-08-28 11:15:17 -04:00
if (setCookieHeader) {
const cookiesArray = setCookieHeader.split(/,(?=\s*\w+=)/);
cookiesArray.forEach((c) => Astro.response.headers.append("set-cookie", c));
2025-08-28 11:15:17 -04:00
newCookieHeader = cookiesArray.map(c => c.split(";")[0]).join("; ");
}
2025-08-28 11:15:17 -04:00
res = await fetch(`${API_URL}/auth/id`, {
headers: { Cookie: newCookieHeader },
credentials: "include",
});
}
2025-08-28 11:15:17 -04:00
if (!res.ok) {
return null;
}
const user = await res.json();
return user;
} catch (err) {
console.error("[SSR] requireAuthHook error:", err);
return null;
}
2025-08-28 11:15:17 -04:00
};