diff --git a/assets/scripts/auth.js b/assets/scripts/auth.js
index 5d582a3..71d4de4 100644
--- a/assets/scripts/auth.js
+++ b/assets/scripts/auth.js
@@ -33,6 +33,7 @@
async function authFetch(input, options = {}) {
const response = await fetch(input, {
...options,
+ credentials: options.credentials || "same-origin",
headers: authHeaders(options.headers),
});
@@ -47,6 +48,7 @@
async function login(username, password) {
const response = await fetch("/api/auth/login", {
method: "POST",
+ credentials: "same-origin",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ username, password }),
});
@@ -60,6 +62,18 @@
return data.token;
}
+ async function hasServerSession() {
+ if (token()) return true;
+
+ const response = await fetch("/api/auth/check", {
+ method: "GET",
+ credentials: "same-origin",
+ cache: "no-store",
+ });
+
+ return response.status === 204;
+ }
+
function initLoginForm() {
const form = document.getElementById("login-form");
if (!form) return;
@@ -91,15 +105,19 @@
fetch: authFetch,
headers: authHeaders,
token,
- logout: () => {
+ logout: async () => {
+ await fetch("/api/auth/logout", {
+ method: "POST",
+ credentials: "same-origin",
+ }).catch(() => {});
window.localStorage.removeItem(TOKEN_KEY);
redirectToLogin();
},
};
- document.addEventListener("DOMContentLoaded", () => {
+ document.addEventListener("DOMContentLoaded", async () => {
initLoginForm();
- if (!isLoginPage() && !token()) {
+ if (!isLoginPage() && !(await hasServerSession())) {
redirectToLogin();
}
});
diff --git a/posts/posts-list.org b/posts/posts-list.org
index c0ec23e..90d111b 100644
--- a/posts/posts-list.org
+++ b/posts/posts-list.org
@@ -4,7 +4,7 @@
See the categories: @@html:Categories@@
* Posts:
-- [[file:career/career-list.org][Career List]] @@html:09-05-2026 00:54@@
+- [[file:career/career-list.org][Career List]] @@html:09-05-2026 01:10@@
- [[file:posts-list.sync-conflict-20260509-005434-VT6366A.org][Posts List]] @@html:09-05-2026 00:54@@
- [[file:posts-list.sync-conflict-20260417-233432-VT6366A.org][Posts List]] @@html:14-04-2026 16:36@@
- [[file:career/ha-dr.org][High Availability, Disaster Recovery and Business Continuity]] @@html:11-03-2026 17:18@@ @@html:learning@@ @@html:notes@@
diff --git a/sitemap.org b/sitemap.org
index 767257a..66bd71d 100644
--- a/sitemap.org
+++ b/sitemap.org
@@ -13,12 +13,12 @@
- [[file:tags/notes.org][Tag: notes]]
- [[file:tags/review.org][Tag: review]]
- [[file:tags/website.org][Tag: website]]
- - [[file:tags/life.org][Tag: life]]
- [[file:tags/update.org][Tag: update]]
- - [[file:tags/insights.org][Tag: insights]]
- - [[file:tags/emacs.org][Tag: emacs]]
+ - [[file:tags/life.org][Tag: life]]
- [[file:tags/education.org][Tag: education]]
+ - [[file:tags/insights.org][Tag: insights]]
- [[file:tags/reading.org][Tag: reading]]
+ - [[file:tags/emacs.org][Tag: emacs]]
- [[file:tags/maths.org][Tag: maths]]
- books
- [[file:books/books-list.org][Books List]]