MCP: prihlaseni jmenem a heslem, tokeny si obstarava portal

Predchozi verze chtela po uzivateli token. Spatne zadani: zakaznik dostane ke
svemu serveru adresu, jmeno a heslo. Token nedostane a nema jak ho ziskat -
vyda ho az autorizacni server a ma omezenou zivotnost. Obstarat ho, hlidat
platnost a vcas ho obnovit je prace portalu.

Novy src/mcp/auth.ts:
- kde se prihlasit se zjisti od serveru pres
  /.well-known/oauth-protected-resource a metadata autorizacniho serveru.
  Rucni pole na adresu je jen zaloha pro servery, ktere metadata nemaji
- cim se zkusi v poradi client_credentials a password. Ktere z toho firma
  dostala, se z udaju samych poznat neda a nutit ji to vybirat by znamenalo
  ptat se na neco, co nevi
- bez autorizacniho serveru se posle HTTP Basic. Mensi servery zadny OAuth
  nemaji a jmeno s heslem je u nich presne tohle
- zivotnost urcuje server: token se vymeni minutu pred vyprsenim, obnovi se
  pres refresh_token, kdyz ho server vydal, a kdyz expires_in chybi, pocita se
  s peti minutami, tedy odhaduje se dolu
- odmitnuty token (401 na token, ktery jsme meli za platny) se zahodi a volani
  se zopakuje jednou. Podruhe uz ne, to uz nejsou platne udaje

Token se drzi jen v pameti. Je kratkodoby, po restartu se o novy rekne znovu,
a ulozit ho by znamenalo vsechna rizika ulozeni bez jakekoliv vyhody. Kes drzi
otisk udaju, takze zmena hesla ulozeny token zneplatni.

Udaje konektoru jsou ted adresa, jmeno, heslo a dve nepovinna pole (adresa pro
prihlaseni a rozsah opravneni). Ani jedno nemiri do hlavicky - Authorization se
pocita az pri volani z toho, co vydal autorizacni server.

Zpusob prihlaseni se pise do hlasky u konektoru: uzivatel vyplnil jmeno a heslo
a ma vedet, jak s nimi portal nalozil, nez zacne hledat chybu jinde.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-08-28 09:52:23 +02:00
co-authored by Claude Opus 5
parent 435e254c90
commit 92fecca70c
5 changed files with 627 additions and 59 deletions
+57 -18
View File
@@ -18,7 +18,7 @@ u nas.
## Jak to vypada
1. Konektory, Novy konektor, sluzba **MCP server**.
2. Vyplni se adresa serveru a token.
2. Vyplni se adresa serveru, jmeno a heslo.
3. Tlacitko **Nacist nastroje**. Portal se serveru zepta, co nabizi.
4. V builderu jsou nastroje jako kroky, s vlastnimi poli a vystupy.
@@ -27,28 +27,63 @@ popis, jake parametry prijima (povinne s hvezdickou) a jake hodnoty vraci.
## Co si firma vyplni
| Pole | K cemu |
| ------------------- | -------------------------------------------------- |
| Adresa MCP serveru | cely endpoint, napr. `https://mcp.firma.cz/mcp` |
| Token | posila se jako `Authorization: Bearer` |
| API klic v hlavicce | pro servery, ktere misto tokenu chteji `X-API-Key` |
Zakaznik dostane ke svemu serveru **adresu, jmeno a heslo**. Token nedostane
a nema jak ho ziskat - vyda ho az autorizacni server a ma omezenou zivotnost.
Obstarat ho, hlidat platnost a vcas ho obnovit je proto prace portalu.
| Pole | K cemu |
| --------------------- | -------------------------------------------------------- |
| Adresa MCP serveru | cely endpoint, napr. `https://mcp.firma.cz/mcp` |
| Jmeno | jmeno nebo ID aplikace, prazdne u serveru bez prihlaseni |
| Heslo | heslo nebo tajny klic k tomu jmenu |
| Adresa pro prihlaseni | jen kdyz ji portal sam nenajde |
| Rozsah opravneni | jen kdyz ji provozovatel serveru rekl |
Adresa je **mezi udaji**, ne v poli "vlastni adresa sluzby". U ostatnich sluzeb
je adresa vlastnost sluzby a konektor ji smi jen prepsat, tady je to naopak:
sluzba zadnou adresu nema, protoze kazda firma ma svuj server. Stejne to ma
SMTP.
Vlastni jmeno hlavicky se zadat neda. Bud `Authorization: Bearer`, nebo
`X-API-Key` - to jsou dva zpusoby, kterymi se autorizuje drtiva vetsina
serveru. Zadat libovolnou hlavicku by znamenalo zmenu modelu pristupovych
udaju, kde jmeno hlavicky urcuje sluzba, ne konektor.
## Prihlaseni a zivotnost tokenu
Cely zivotni cyklus tokenu resi `src/mcp/auth.ts`. Postup je vzdy stejny:
1. **Kde se prihlasit.** Bud je adresa vyplnena u konektoru, nebo se zjisti od
serveru: `/.well-known/oauth-protected-resource` rekne, ktery autorizacni
server za nim stoji, a jeho metadata rikaji token endpoint.
2. **Cim se prihlasit.** Nejdriv `client_credentials`, tedy jmeno a heslo jako
identita aplikace. Kdyz to server odmitne, zkusi se `password`, tedy jmeno
a heslo jako uzivatel. Ktere z toho firma dostala, se z udaju samych poznat
neda a nutit ji to vybirat by znamenalo ptat se na neco, co nevi.
3. **Kdyz autorizacni server neni**, posle se HTTP Basic. Mensi servery zadny
OAuth nemaji a jmeno s heslem je u nich presne tohle.
Ktera z cest to byla, se pise do hlasky u konektoru: uzivatel vyplnil jmeno
a heslo a ma vedet, jak s nimi portal nalozil, nez zacne hledat chybu jinde.
Zivotnost urcuje server:
| Situace | Co portal udela |
| -------------------------------- | ---------------------------------------------- |
| token plati | pouzije ho |
| do vyprseni zbyva min nez minuta | vymeni ho driv, nez vyprsi behem volani |
| server poslal `refresh_token` | obnovi jim, je to levnejsi nez cele prihlaseni |
| `expires_in` server neuvedl | pocita s peti minutami, tedy odhaduje dolu |
| server token odmitne pres 401 | zahodi ho a zkusi to **jednou** znovu |
To posledni je na odebrana opravneni: token jeste neexpiroval, ale uz neplati.
Druhy pokus uz se nedela - to uz nejsou udaje, ktere by sedely.
**Token se drzi jen v pameti.** Je kratkodoby, takze po restartu se o novy rekne
znovu. Do souboru ani do tabulky nepatri: ulozit kratkodoby token je vsechna
rizika ulozeni bez jakekoliv vyhody.
## Nacteni nastroju
`POST /api/dashboard/connectors/{id}/mcp/tools`
Je to zaroven **overeni konektoru**, proto se zapisuje do historie: kdyz server
odpovi seznamem, adresa i token sedi. Nic to nemeni, da se to spustit kdykoliv.
odpovi seznamem, adresa i prihlaseni sedi. Nic to nemeni, da se to spustit kdykoliv.
Tlacitko "Overit" u MCP konektoru neni - delalo by presne tohle.
Dve pravidla, ktera nejsou zrejma:
@@ -104,8 +139,11 @@ text odpovedi. Neni to nedodelek u nas.
- **Adresa nesmi mirit do vnitrni site.** Tataz kontrola jako u HTTP a SMTP,
vyplnuje ji firma.
- **Token neopousti server.** Do prohlizece se nevraci a v logu je zredigovany
- **Heslo ani token neopousti server.** Heslo se z API nevraci vubec, token
nikde nevznika jinde nez v pameti procesu. V logu jsou zredigovane oboje,
vcetne tvaru bez slova `Bearer`.
- **Zmena hesla zneplatni ulozeny token.** Kes si drzi otisk udaju, takze po
uprave konektoru se portal prihlasi znovu.
- **Cizi napojeni se chova jako neexistujici.** Krok si konektor nacita pres
filtr na firmu, takze strom s cizim ID konektoru selze.
- **Krok se neopakuje.** MCP nema idempotencni klic, takze druhy pokus po
@@ -134,6 +172,7 @@ text odpovedi. Neni to nedodelek u nas.
| Cast | Soubor |
| ------------------- | ------------------------------------------- |
| Protokol | `src/mcp/client.ts` |
| Prihlaseni a tokeny | `src/mcp/auth.ts` |
| Prevod schemat | `src/mcp/schema.ts` |
| Nastroje v katalogu | `src/data/mcpTools.ts` |
| Sluzba `mcp` | `src/data/services.ts` |
@@ -144,12 +183,12 @@ text odpovedi. Neni to nedodelek u nas.
## Co jeste chybi
| Chybi | Poznamka |
| ---------------------------- | -------------------------------------------------------------------- |
| Nastroje pro model | dnes vybira nastroj clovek. Predat je modelu je dalsi krok, viz nize |
| stdio a starsi SSE transport | umi se jen Streamable HTTP, tedy to, co delaji verejne servery |
| Schvalovani volani | server ho umi vyzadovat, my na to zatim neumime cekat |
| Vlastni jmeno hlavicky | jen `Authorization` a `X-API-Key` |
| Chybi | Poznamka |
| ---------------------------- | ----------------------------------------------------------------------- |
| Nastroje pro model | dnes vybira nastroj clovek. Predat je modelu je dalsi krok, viz nize |
| stdio a starsi SSE transport | umi se jen Streamable HTTP, tedy to, co delaji verejne servery |
| Schvalovani volani | server ho umi vyzadovat, my na to zatim neumime cekat |
| Prihlaseni s presmerovanim | authorization code vyzaduje cloveka v prohlizeci, napojeni bezi bez nej |
### Nastroje pro model
+29
View File
@@ -2,6 +2,35 @@
Nejnovejsi nahore.
## 2026-08-28 - MCP: prihlaseni jmenem a heslem, tokeny si resi portal
Predchozi verze chtela po uzivateli token. To bylo spatne zadani: zakaznik
dostane ke svemu serveru **adresu, jmeno a heslo**, token nedostane a nema jak
ho ziskat - vyda ho az autorizacni server a ma omezenou zivotnost.
Novy `src/mcp/auth.ts` resi cely zivotni cyklus:
- **Kde se prihlasit** se zjisti od serveru pres
`/.well-known/oauth-protected-resource` a metadata autorizacniho serveru.
Rucni pole na adresu je jen zaloha pro servery, ktere metadata nemaji.
- **Cim** se zkusi v poradi `client_credentials` a `password`. Ktere z toho
firma dostala, se z udaju samych poznat neda a nutit ji to vybirat by
znamenalo ptat se na neco, co nevi.
- **Bez autorizacniho serveru** se posle HTTP Basic. Mensi servery zadny OAuth
nemaji a jmeno s heslem je u nich presne tohle.
- **Zivotnost urcuje server.** Token se vymeni minutu pred vyprsenim, obnovi se
pres `refresh_token`, kdyz ho server vydal, a kdyz `expires_in` chybi, pocita
se s peti minutami - tedy odhaduje se dolu.
- **Odmitnuty token** (401 na token, ktery jsme meli za platny) se zahodi
a volani se zopakuje jednou. Podruhe uz ne, to uz nejsou platne udaje.
Token se drzi **jen v pameti**. Je kratkodoby, po restartu se o novy rekne
znovu, a ulozit ho by znamenalo vsechna rizika ulozeni bez jakekoliv vyhody.
Kes si drzi otisk udaju, takze zmena hesla ulozeny token zneplatni.
Zpusob prihlaseni je videt v hlasce u konektoru: uzivatel vyplnil jmeno a heslo
a ma vedet, jak s nimi portal nalozil, nez zacne hledat chybu jinde.
## 2026-08-28 - MCP konektory hotove
Firma si zalozi napojeni na svuj MCP server, stiskne **Nacist nastroje** a jeho