58 lines
1.6 KiB
JavaScript
58 lines
1.6 KiB
JavaScript
|
|
export const requireAuthHook = async () => {
|
||
|
|
const token = Astro.cookies.get("access_token")?.value;
|
||
|
|
let user = null;
|
||
|
|
|
||
|
|
try {
|
||
|
|
if (!token) throw Error("No access token");
|
||
|
|
|
||
|
|
// Step 1: verify current access token
|
||
|
|
user = verifyToken(token);
|
||
|
|
|
||
|
|
if (!user) throw Error("Invalid access token");
|
||
|
|
|
||
|
|
console.log("Verified!", user);
|
||
|
|
|
||
|
|
} catch (err) {
|
||
|
|
console.log("Access token check failed:", err.message);
|
||
|
|
|
||
|
|
// Step 2: attempt refresh if refresh_token exists
|
||
|
|
const refreshToken = Astro.cookies.get("refresh_token")?.value;
|
||
|
|
if (refreshToken) {
|
||
|
|
try {
|
||
|
|
const newTokens = await refreshAccessToken(refreshToken);
|
||
|
|
if (newTokens?.accessToken) {
|
||
|
|
// store new access token
|
||
|
|
Astro.cookies.set("access_token", newTokens.accessToken, {
|
||
|
|
path: "/",
|
||
|
|
httpOnly: true,
|
||
|
|
sameSite: "lax",
|
||
|
|
secure: true,
|
||
|
|
});
|
||
|
|
|
||
|
|
// Optionally replace refresh_token too
|
||
|
|
if (newTokens.refreshToken) {
|
||
|
|
Astro.cookies.set("refresh_token", newTokens.refreshToken, {
|
||
|
|
path: "/",
|
||
|
|
httpOnly: true,
|
||
|
|
sameSite: "lax",
|
||
|
|
secure: true,
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// re-verify user with new token
|
||
|
|
user = verifyToken(newTokens.accessToken);
|
||
|
|
|
||
|
|
if (user) {
|
||
|
|
console.log("Refreshed + verified!", user);
|
||
|
|
return; // ✅ authenticated now
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} catch (refreshErr) {
|
||
|
|
console.error("Refresh failed:", refreshErr.message);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Step 3: if still no user, redirect
|
||
|
|
return Astro.redirect("/login");
|
||
|
|
}
|
||
|
|
}
|