Files
verdande/internal/store/migrations/0038_mcp_med_kontoen.sql
T
kristianwindandClaude Opus 5.5 e7df876c4a feat(mcp): forbind med kontoen i stedet for med et token
Claude's forbindelsesdialog prøver OAuth først. Indtil nu var svaret 404,
og eneste vej ind var at lave et token og sætte det ind i en adresse. Nu
er instansen sin egen autorisationsserver for MCP-klienter:

- /.well-known/oauth-protected-resource(/mcp) og
  /.well-known/oauth-authorization-server peger på login'et; en 401 fra
  /mcp bærer WWW-Authenticate med resource_metadata
- /oauth/register (RFC 7591), kun offentlige klienter; registreringer,
  ingen godkender, ryddes efter et døgn
- /oauth/authorize sender til /forbind, som logger ind med det almindelige
  login og spørger "Claude vil forbinde til din konto" — og viser, hvor
  adgangen sendes hen, fordi navnet er klientens eget
- /oauth/token: authorization code + S256 PKCE, koden gælder ét minut og
  én gang; ud kommer et almindeligt API-token, listet under Tokens med
  klientens navn, og en ny forbindelse fra samme klient erstatter det
- /mcp tager nu også Authorization: Bearer; ?key= virker stadig

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 22:49:48 +01:00

30 lines
1.5 KiB
SQL

-- At forbinde Claude med sin konto i stedet for med et token, man selv har lavet.
--
-- Claude's forbindelsesdialog prøver OAuth, før den gør noget andet, og indtil nu
-- var svaret "det findes ikke her" — så den eneste vej ind var at lave et token i
-- indstillingerne og sætte det ind i en adresse. Det virker, men det er en
-- hemmelighed, man skal kopiere mellem to programmer, og det er præcis det trin,
-- folk går i stå på.
--
-- En klient registrerer sig selv (RFC 7591) og får et id. Ingen hemmelighed: en
-- klient, der kører hos en anden, kan ikke holde på en, så det er PKCE, der beviser,
-- at det er den samme, der kommer tilbage med koden.
CREATE TABLE oauth_clients (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
-- JSON-liste. Kun adresser, klienten selv opgav ved registreringen, kan få en
-- kode sendt hen til sig — ellers er "godkend" en knap, der sender adgangen til
-- hvem som helst.
redirect_uris TEXT NOT NULL,
created_at INTEGER NOT NULL
);
-- Det, en godkendelse udsteder, er et almindeligt API-token. Det står derfor på
-- siden med tokens, kan tilbagekaldes der, og når alle de steder, et token
-- allerede gælder. Kolonnen siger, hvilken klient det hører til, så en ny
-- godkendelse fra den samme klient erstatter den gamle frem for at lægge sig ved
-- siden af.
ALTER TABLE api_tokens ADD COLUMN oauth_client_id TEXT REFERENCES oauth_clients (id) ON DELETE CASCADE;
CREATE INDEX idx_api_tokens_oauth_client ON api_tokens (oauth_client_id) WHERE oauth_client_id IS NOT NULL;