[ISS-9] getAuth en getTokenScopedProducts controleren expires_at niet: verlopen API-token blijft werken #164

Closed
opened 2026-09-27 18:38:34 +02:00 by janpeter · 0 comments
Owner

Beheerd door Scrum4Me — wijzigingen hier worden overschreven. Bron: https://thuis.jp-visser.nl/issues/cmuk1c1e900010c17z1crpwwd

Status: closed (fixed) · Severity: s3_major · Gemeld door: mac:claude · Occurrences: 1 (laatst: 2026-09-27T16:30:45.009Z) · Aangemaakt: 2026-09-27T16:30:45.009Z

Registratie

Probleem

ApiToken.expires_at wordt in src/auth.ts niet gecontroleerd. getAuth() (regel 29-36) en getTokenScopedProducts() (regel 75-85) weigeren alleen bij revoked_at. Een token met een vervaldatum in het verleden blijft daardoor geldig op alle MCP-tools, terwijl de workers-UI het als "Verlopen" toont.

Het dispatchpad doet het wel goed: src/dispatch/auth.ts:14-15 filtert op revoked_at IS NULL AND (expires_at IS NULL OR expires_at > now()).

Geverifieerd

origin/main c20688e (2026-09-27): grep -c expires_at src/auth.ts geeft 0.

Afgesproken oplossing (akkoord JP 2026-09-27)

  • Token met expires_at <= now behandelen als ongeldig, met dezelfde foutmelding als een ingetrokken token.
  • getTokenScopedProducts() geeft voor zo'n token [].
  • Tests: verlopen geweigerd, zonder vervaldatum geaccepteerd, vervaldatum in de toekomst geaccepteerd.

Buiten deze fix

src/presence/heartbeat.ts:21-25 controleert ook alleen revoked_at; beslissing van JP staat nog open.

Gevolg bij uitrol

Niet-ingetrokken tokens die al verlopen zijn, worden na de fix geweigerd. JP controleert dat zelf voor de merge.

Zelfde omissie in Scrum4Me lib/api-auth.ts; daarvoor is een eigen issue op dat product aangemaakt. Gevonden tijdens de read-only review van IDEA-227, maar valt daarbuiten.

Onderzoek


2026-09-27T16:38:11.578Z — mac:claude

Fix staat klaar in PR #163 (branch fix/api-token-expiry, commit ec10777). Nog niet gemerged; merge en uitrol wachten op opdracht van JP.

  • src/auth.ts: getAuth() en getTokenScopedProducts() weigeren een token met expires_at <= now.
  • Tests in __tests__/auth-scoped.test.ts; drie faalden voor de fix.
  • npm run typecheck schoon, npm test 1814 geslaagd / 51 overgeslagen.

Open: controle door JP op al verlopen, niet-ingetrokken tokens voor de merge. Heartbeat (src/presence/heartbeat.ts) zit niet in deze PR.


2026-09-27T18:18:39.561Z — mac:claude

Heartbeat op opdracht van JP meegenomen in dezelfde PR (#163), als tweede commit.

  • src/presence/heartbeat.ts: tick wordt overgeslagen bij een verlopen token; geen last_seen_at-verversing en geen herregistratie van een verdwenen worker-rij.
  • isTokenExpired geexporteerd uit src/auth.ts, gedeeld door beide paden.
  • Tests in __tests__/heartbeat-user-id-refresh.test.ts.
  • npm run typecheck schoon, npm test 1816 geslaagd / 51 overgeslagen.

Nog open: tokencheck door JP voor de merge.


2026-09-27T18:19:55.724Z — mac:claude

Correctie op de vorige notitie: de heartbeat-fix zit niet in PR #163. Die PR was door JP al gemerged (2026-09-27 19:26, merge-commit 4c9489f) voordat de heartbeat-commit 3e94daa werd gepusht.

Stand:

  • In main: getAuth() en getTokenScopedProducts() (commit ec10777, via #163).
  • Nog niet in main: heartbeat-fix, staat in vervolg-PR #165. Merge wacht op opdracht van JP.

Oplossing


2026-09-27T18:33:01.500Z — mac:claude

Opgelost in main via twee PR's, beide gemerged door JP op 2026-09-27:

  • #163 (merge 4c9489f): getAuth() en getTokenScopedProducts() weigeren een token met expires_at <= now, met dezelfde foutmelding als een ingetrokken token.
  • #165 (merge d9e825f): de heartbeat slaat de tick over bij een verlopen token; isTokenExpired is gedeeld vanuit src/auth.ts.

Tests: __tests__/auth-scoped.test.ts en __tests__/heartbeat-user-id-refresh.test.ts. Lokaal npm run typecheck schoon en npm test 1816 geslaagd / 51 overgeslagen.

Nog niet uitgerold. De final-release-job op main faalde voor beide merges (runs 223 en 225) op een timeout in __tests__/packaged-release.test.ts, die los staat van deze wijziging. Daardoor is er geen pakket en geen deploy/*-tag voor 4c9489f of d9e825f; de laatste gepubliceerde versie is c20688e, zonder deze fix.

> Beheerd door Scrum4Me — wijzigingen hier worden overschreven. Bron: https://thuis.jp-visser.nl/issues/cmuk1c1e900010c17z1crpwwd Status: closed (fixed) · Severity: s3_major · Gemeld door: mac:claude · Occurrences: 1 (laatst: 2026-09-27T16:30:45.009Z) · Aangemaakt: 2026-09-27T16:30:45.009Z ## Registratie ## Probleem `ApiToken.expires_at` wordt in `src/auth.ts` niet gecontroleerd. `getAuth()` (regel 29-36) en `getTokenScopedProducts()` (regel 75-85) weigeren alleen bij `revoked_at`. Een token met een vervaldatum in het verleden blijft daardoor geldig op alle MCP-tools, terwijl de workers-UI het als "Verlopen" toont. Het dispatchpad doet het wel goed: `src/dispatch/auth.ts:14-15` filtert op `revoked_at IS NULL AND (expires_at IS NULL OR expires_at > now())`. ## Geverifieerd origin/main `c20688e` (2026-09-27): `grep -c expires_at src/auth.ts` geeft 0. ## Afgesproken oplossing (akkoord JP 2026-09-27) - Token met `expires_at <= now` behandelen als ongeldig, met dezelfde foutmelding als een ingetrokken token. - `getTokenScopedProducts()` geeft voor zo'n token `[]`. - Tests: verlopen geweigerd, zonder vervaldatum geaccepteerd, vervaldatum in de toekomst geaccepteerd. ## Buiten deze fix `src/presence/heartbeat.ts:21-25` controleert ook alleen `revoked_at`; beslissing van JP staat nog open. ## Gevolg bij uitrol Niet-ingetrokken tokens die al verlopen zijn, worden na de fix geweigerd. JP controleert dat zelf voor de merge. Zelfde omissie in Scrum4Me `lib/api-auth.ts`; daarvoor is een eigen issue op dat product aangemaakt. Gevonden tijdens de read-only review van IDEA-227, maar valt daarbuiten. ## Onderzoek --- *2026-09-27T16:38:11.578Z — mac:claude* Fix staat klaar in PR https://git.jp-visser.nl/janpeter/scrum4me-mcp/pulls/163 (branch `fix/api-token-expiry`, commit `ec10777`). Nog niet gemerged; merge en uitrol wachten op opdracht van JP. - `src/auth.ts`: `getAuth()` en `getTokenScopedProducts()` weigeren een token met `expires_at <= now`. - Tests in `__tests__/auth-scoped.test.ts`; drie faalden voor de fix. - `npm run typecheck` schoon, `npm test` 1814 geslaagd / 51 overgeslagen. Open: controle door JP op al verlopen, niet-ingetrokken tokens voor de merge. Heartbeat (`src/presence/heartbeat.ts`) zit niet in deze PR. --- *2026-09-27T18:18:39.561Z — mac:claude* Heartbeat op opdracht van JP meegenomen in dezelfde PR (#163), als tweede commit. - `src/presence/heartbeat.ts`: tick wordt overgeslagen bij een verlopen token; geen `last_seen_at`-verversing en geen herregistratie van een verdwenen worker-rij. - `isTokenExpired` geexporteerd uit `src/auth.ts`, gedeeld door beide paden. - Tests in `__tests__/heartbeat-user-id-refresh.test.ts`. - `npm run typecheck` schoon, `npm test` 1816 geslaagd / 51 overgeslagen. Nog open: tokencheck door JP voor de merge. --- *2026-09-27T18:19:55.724Z — mac:claude* Correctie op de vorige notitie: de heartbeat-fix zit niet in PR #163. Die PR was door JP al gemerged (2026-09-27 19:26, merge-commit `4c9489f`) voordat de heartbeat-commit `3e94daa` werd gepusht. Stand: - In main: `getAuth()` en `getTokenScopedProducts()` (commit `ec10777`, via #163). - Nog niet in main: heartbeat-fix, staat in vervolg-PR https://git.jp-visser.nl/janpeter/scrum4me-mcp/pulls/165. Merge wacht op opdracht van JP. ## Oplossing --- *2026-09-27T18:33:01.500Z — mac:claude* Opgelost in main via twee PR's, beide gemerged door JP op 2026-09-27: - #163 (merge `4c9489f`): `getAuth()` en `getTokenScopedProducts()` weigeren een token met `expires_at <= now`, met dezelfde foutmelding als een ingetrokken token. - #165 (merge `d9e825f`): de heartbeat slaat de tick over bij een verlopen token; `isTokenExpired` is gedeeld vanuit `src/auth.ts`. Tests: `__tests__/auth-scoped.test.ts` en `__tests__/heartbeat-user-id-refresh.test.ts`. Lokaal `npm run typecheck` schoon en `npm test` 1816 geslaagd / 51 overgeslagen. Nog niet uitgerold. De final-release-job op main faalde voor beide merges (runs 223 en 225) op een timeout in `__tests__/packaged-release.test.ts`, die los staat van deze wijziging. Daardoor is er geen pakket en geen `deploy/*`-tag voor `4c9489f` of `d9e825f`; de laatste gepubliceerde versie is `c20688e`, zonder deze fix. <!-- s4m:issue:cmuk1c1e900010c17z1crpwwd -->
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-mcp#164
No description provided.