From 27880646cc60417cd85709f875a70c8868fb150f Mon Sep 17 00:00:00 2001 From: beo3000 Date: Sat, 21 Feb 2026 13:17:07 +0100 Subject: [PATCH] fix sync in local test env --- .claude/settings.local.json | 4 +++- ka-note/.env.example | 3 +++ ka-note/server/ka-note.db-shm | Bin 32768 -> 32768 bytes ka-note/server/ka-note.db-wal | Bin 115392 -> 1013552 bytes ka-note/server/package.json | 2 +- ka-note/server/src/middleware/auth.ts | 12 ++++++++++-- 6 files changed, 17 insertions(+), 4 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 5e51b2d..72e3c4e 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -14,7 +14,9 @@ "Bash(az webapp config appsettings list:*)", "Bash(node:*)", "Bash(python3:*)", - "Bash(echo:*)" + "Bash(echo:*)", + "Bash(git -C ka-note check-ignore .env)", + "Bash(git -C . check-ignore ka-note/.env)" ] } } diff --git a/ka-note/.env.example b/ka-note/.env.example index 46814c9..f896b3a 100644 --- a/ka-note/.env.example +++ b/ka-note/.env.example @@ -1,6 +1,9 @@ AZURE_CLIENT_ID= AZURE_TENANT_ID= +# Set to true for local dev to skip JWT verification (never use in production) +# DEV_AUTH_BYPASS=true + # Client needs VITE_ prefix — create client/.env with: # VITE_AZURE_CLIENT_ID= # VITE_AZURE_TENANT_ID= diff --git a/ka-note/server/ka-note.db-shm b/ka-note/server/ka-note.db-shm index b1bb41a91038b2c95093b898c0bdac77176222e7..52d4c438b495685de1569655ce7cec68366aa826 100644 GIT binary patch literal 32768 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 F{Qo_9rO5yQ delta 11 Scmdn+&h|hnd&3sS1BU=4ZUx@} diff --git a/ka-note/server/package.json b/ka-note/server/package.json index 4beadd1..bae9e7d 100644 --- a/ka-note/server/package.json +++ b/ka-note/server/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "dev": "node --watch --import tsx/esm src/index.ts", + "dev": "node --env-file=../.env --watch --import tsx/esm src/index.ts", "build": "tsc", "start": "node dist/index.js", "db:generate": "drizzle-kit generate", diff --git a/ka-note/server/src/middleware/auth.ts b/ka-note/server/src/middleware/auth.ts index 407aa59..078ebef 100644 --- a/ka-note/server/src/middleware/auth.ts +++ b/ka-note/server/src/middleware/auth.ts @@ -13,14 +13,22 @@ export type AuthEnv = { const clientId = process.env.AZURE_CLIENT_ID ?? ''; const tenantId = process.env.AZURE_TENANT_ID ?? ''; +const devBypass = process.env.DEV_AUTH_BYPASS === 'true'; const jwksUrl = `https://login.microsoftonline.com/${tenantId}/discovery/v2.0/keys`; const issuerV2 = `https://login.microsoftonline.com/${tenantId}/v2.0`; const issuerV1 = `https://sts.windows.net/${tenantId}/`; -const JWKS = createRemoteJWKSet(new URL(jwksUrl)); +const JWKS = devBypass ? null : createRemoteJWKSet(new URL(jwksUrl)); export const authMiddleware = createMiddleware(async (c, next) => { + if (devBypass) { + console.warn('[auth] DEV_AUTH_BYPASS active — skipping JWT verification'); + c.set('auth', { userId: 'dev-user', name: 'Dev User', email: 'dev@localhost' }); + await next(); + return; + } + const authHeader = c.req.header('Authorization'); if (!authHeader?.startsWith('Bearer ')) { return c.json({ error: 'Missing or invalid Authorization header' }, 401); @@ -28,7 +36,7 @@ export const authMiddleware = createMiddleware(async (c, next) => { const token = authHeader.slice(7); try { - const { payload } = await jwtVerify(token, JWKS, { + const { payload } = await jwtVerify(token, JWKS!, { issuer: [issuerV2, issuerV1], audience: `api://${clientId}`, });