fix(auth): verlopen API-token weigeren in getAuth en getTokenScopedProducts (ISS-9) #163

Merged
janpeter merged 1 commit from fix/api-token-expiry into main 2026-09-27 19:26:26 +02:00
Owner

Probleem

getAuth() en getTokenScopedProducts() in src/auth.ts controleerden alleen revoked_at. Een token met expires_at in het verleden bleef daardoor werken op alle MCP-tools, terwijl de workers-UI het als "Verlopen" toont. Het dispatchpad (src/dispatch/auth.ts) controleerde de vervaldatum al wel.

Wijziging

  • getAuth() weigert een token met expires_at <= now, met dezelfde foutmelding als een ingetrokken token.
  • getTokenScopedProducts() geeft voor zo'n token [] en vraagt expires_at op in de select.
  • Grens gelijk aan het dispatchpad: geldig is alleen expires_at IS NULL of > now.

Tests

__tests__/auth-scoped.test.ts: verlopen geweigerd, zonder vervaldatum geaccepteerd, toekomstige vervaldatum geaccepteerd, voor beide functies. Drie van de nieuwe tests faalden voor de fix.

npm run typecheck en npm test: 1814 geslaagd, 51 overgeslagen (integratiesuites zonder database).

Let op bij uitrol

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

Niet in deze PR

src/presence/heartbeat.ts controleert ook alleen revoked_at. Die fix kwam na de merge van deze PR en staat in een eigen vervolg-PR.

Zuster-PR in Scrum4Me voor lib/api-auth.ts (ISS-2).

🤖 Generated with Claude Code

## Probleem `getAuth()` en `getTokenScopedProducts()` in `src/auth.ts` controleerden alleen `revoked_at`. Een token met `expires_at` in het verleden bleef daardoor werken op alle MCP-tools, terwijl de workers-UI het als "Verlopen" toont. Het dispatchpad (`src/dispatch/auth.ts`) controleerde de vervaldatum al wel. ## Wijziging - `getAuth()` weigert een token met `expires_at <= now`, met dezelfde foutmelding als een ingetrokken token. - `getTokenScopedProducts()` geeft voor zo'n token `[]` en vraagt `expires_at` op in de select. - Grens gelijk aan het dispatchpad: geldig is alleen `expires_at IS NULL` of `> now`. ## Tests `__tests__/auth-scoped.test.ts`: verlopen geweigerd, zonder vervaldatum geaccepteerd, toekomstige vervaldatum geaccepteerd, voor beide functies. Drie van de nieuwe tests faalden voor de fix. `npm run typecheck` en `npm test`: 1814 geslaagd, 51 overgeslagen (integratiesuites zonder database). ## Let op bij uitrol Niet-ingetrokken tokens die al verlopen zijn, worden na deze wijziging geweigerd. JP controleert dat voor de merge. ## Niet in deze PR `src/presence/heartbeat.ts` controleert ook alleen `revoked_at`. Die fix kwam na de merge van deze PR en staat in een eigen vervolg-PR. Zuster-PR in Scrum4Me voor `lib/api-auth.ts` (ISS-2). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix(auth): verlopen API-token weigeren in getAuth en getTokenScopedProducts (ISS-9)
All checks were successful
CI / Final merge attestation and immutable publication (pull_request) Has been skipped
CI / PR candidate (never published) (pull_request) Successful in 6m54s
ec107775e2
Beide functies controleerden alleen revoked_at, waardoor een token met
expires_at in het verleden op alle MCP-tools bleef werken terwijl de
workers-UI het als "Verlopen" toont. De grens volgt het dispatchpad
(src/dispatch/auth.ts): geldig is alleen expires_at IS NULL of > now.

Een verlopen token krijgt dezelfde foutmelding als een ingetrokken token,
zodat de melding niet verraadt welke van de twee het is.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
s4m-codex-reviewer left a comment

Verdict: APPROVED

Bevindingen

Geen bevindingen met blokkerende of error-severity.

De expiratiecontrole volgt de bestaande dispatch-semantiek: een token is uitsluitend geldig wanneer expires_at leeg is of strikt in de toekomst ligt. De wijziging dekt zowel getAuth als de scope-helper af, met gerichte tests voor verlopen, lege en toekomstige waarden.

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Testverificatie kon lokaal niet worden uitgevoerd: de tijdelijke reviewmap is als noexec gemount (esbuild kreeg EACCES). Dit is geen defect in de PR; de test- en TypeScript-configuratie zijn wel geïnspecteerd.

## Verdict: APPROVED ### Bevindingen Geen bevindingen met blokkerende of error-severity. De expiratiecontrole volgt de bestaande dispatch-semantiek: een token is uitsluitend geldig wanneer `expires_at` leeg is of strikt in de toekomst ligt. De wijziging dekt zowel `getAuth` als de scope-helper af, met gerichte tests voor verlopen, lege en toekomstige waarden. Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. _Testverificatie kon lokaal niet worden uitgevoerd: de tijdelijke reviewmap is als `noexec` gemount (esbuild kreeg `EACCES`). Dit is geen defect in de PR; de test- en TypeScript-configuratie zijn wel geïnspecteerd._
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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!163
No description provided.