fix(cms): Safari-compatible authentication
CI Pipeline with Test Management / 🧪 Run Tests & Generate Reports (push) Waiting to run
CI Pipeline with Test Management / 🐳 Docker Integration Tests (push) Blocked by required conditions
CI Pipeline with Test Management / 🏗️ Build Docker Image (push) Blocked by required conditions
CI Pipeline with Test Management / 📊 Generate Test Summary (push) Blocked by required conditions
Test Reporting & Gherkin Analysis / 🧪 Run Tests & Generate Reports (push) Waiting to run
Test Reporting & Gherkin Analysis / 📊 Analyze Test Coverage (push) Blocked by required conditions
Test Reporting & Gherkin Analysis / 🔄 Sync with Linear (push) Blocked by required conditions
Test Reporting & Gherkin Analysis / ⚡ Performance Monitoring (push) Blocked by required conditions

Safari-specific deviations fixed:

1. Safari shows its native auth dialog on fetch() calls answered with a
   401 + WWW-Authenticate challenge (e.g. save with an expired session).
   All CMS 401 responses now omit WWW-Authenticate; browsers use the styled
   /login page instead.
2. Safari caches Basic credentials and resends them automatically, which
   made logout ineffective (a navigation after logout went straight back
   into the editor). Browser navigations (GET + text/html) now authenticate
   ONLY via the session cookie; Basic Auth remains valid for non-browser
   clients (curl, API).
3. /login and redirects send Cache-Control: no-store so Safari does not
   cache the login page or the 302.

Closes MITHOME-62
This commit is contained in:
Do Siki
2026-08-18 21:14:12 +02:00
parent 27b84cb87c
commit a7b1a2cab2
3 changed files with 40 additions and 11 deletions
+3 -2
View File
@@ -47,10 +47,11 @@ async function waitForServer(timeoutMs = 10000) {
async function main() {
await waitForServer();
// 1. /logout answers 401 with a challenge header, without credentials
// 1. /logout answers 401 without a Basic challenge (Safari would pop its
// native auth dialog on challenged fetch calls)
const logoutRes = await fetch(`${BASE}/logout`);
assert.equal(logoutRes.status, 401);
assert.match(logoutRes.headers.get('www-authenticate') || '', /Basic realm="mozdIT CMS"/);
assert.equal(logoutRes.headers.get('www-authenticate'), null);
// 2. /logout is exempt from the auth rate limiter: many logout calls must not
// consume the failed-login budget.