# Autentizácia a OAuth

> API kľúče, OAuth 2.1 s PKCE (SMART on FHIR standalone launch), OpenID Connect id_token, SMART v2 patient scopes, životnosť tokenov a životný cyklus súhlasu.

Source: https://developers.anpheros.com/sk/guides/authentication

Anpheros Platform akceptuje tri druhy poverení. Každý požiadavka nesie presne jedno.

| Poverenie | Vyzerá ako | Kto | Vidí |
|---|---|---|---|
| API kľúč | `sk_test_…` (sandbox) / `sk_live_…` (production) | server projektu | pacienti, ktorých projekt vytvoril (v sandboxe vrátane vlastnej kópie 30 syntetických pacientov) |
| OAuth access token | `at_…` | aplikácia konajúca v mene jedného pacienta na základe súhlasu | iba tohto pacienta, v rámci udelených SMART scopes |
| Firebase ID token | JWT | vývojár v dashboarde, alebo pacient v sekcii "Connections" | svoje vlastné organizácie / svoje vlastné záznamy |

Pošlite ho ako `Authorization: Bearer <credential>` (API kľúče fungujú aj ako `X-Api-Key`).

## API kľúče
- Vytvorené v dashboarde alebo cez `POST /admin/projects/{id}/keys`; zobrazené raz; uložené ako SHA-256 hash.
- Scopes: `read`, `write`. Kľúč nikdy neprekročí prostredie svojho projektu (`sk_test_` sa nedostane k produkčným dátam a naopak).
- Limit na počet požiadaviek na kľúč (predvolené 600/min) je vynucovaný celoplošne (shared store), s `Retry-After` na 429. Existuje aj limit na IP adresu 600/min.
- Voliteľné hlavičky pri zápise: `X-Anpheros-Author-Type`, `X-Anpheros-Author-Ref`, `X-Anpheros-Source-System`, `X-Anpheros-Origin-Id`, `X-Anpheros-Acting-As` (Practitioner/PractitionerRole **z vášho vlastného adresára**), `X-Anpheros-On-Behalf-Of` (Organization z vášho vlastného adresára). Tieto hlavičky vypĺňajú Provenance.

## OAuth 2.1 (SMART on FHIR, samostatné spustenie)
Discovery: `GET /.well-known/smart-configuration`.

1. `GET /oauth/authorize?response_type=code&client_id=…&redirect_uri=…&scope=…&state=…&code_challenge=…&code_challenge_method=S256[&purpose=treatment][&patient=<pairwise id>][&lang=ro]`
   Zobrazuje hosťovanú stránku súhlasu. PKCE S256 je povinné; `redirect_uri` musí byť presne zaregistrované.
2. Pacient sa prihlási (Google alebo e-mail cez Firebase), vyberie záznam (svoj alebo závislej osoby), trvanie (30/90/180/365 dní) a povolí. Platforma vydá jednorazový kód (10 minút).
3. `POST /oauth/token` s `grant_type=authorization_code&code=…&code_verifier=…&redirect_uri=…&client_id=…` (dôverné klienty pridajú `client_secret`).
   Odpoveď: `access_token` (30 min), `refresh_token` (30 dní, rotujúce), `patient` (vaše párové ID pre záznam), `grant_id`, `scope`.
4. Obnovenie: `grant_type=refresh_token`. Každý obnovovací token je jednorazový. **Predloženie použitého obnovovacieho tokenu zruší celý reťazec** (detekcia krádeže). Paralelné duplikovanie žiadosti o obnovenie je odmietnuté a môže tiež zrušiť reťazec, preto nikdy nerotujte súčasne.
5. Zrušenie: `POST /oauth/revoke` (token + client_id). Zrušenie obnovovacieho tokenu tiež zruší jeho prístupové tokeny.

Odpovede tokenov nesú `Cache-Control: no-store` a `Pragma: no-cache`, ako vyžaduje SMART.

### OpenID Connect (`openid fhirUser`)
Požiadajte o `openid fhirUser` spolu s oblasťami pacienta a odpoveď tokenu bude tiež obsahovať `id_token`: JWT podpísané s RS256, s `iss` (základná URL platformy), `sub` (vaše párové ID pre osobu), `aud` (vaše `client_id`), `exp`, `iat` a `fhirUser` — absolútna URL zdroja Pacienta osoby, čitateľná s prístupovým tokenom, ktorý ste práve dostali. Discovery sa nachádza na `GET /.well-known/openid-configuration`; verejné kľúče na `GET /oauth/jwks` (`kid` v hlavičke tokenu). Parameter `nonce` ešte nie je podporovaný (je voliteľný v toku autorizačného kódu). `launch/patient` a `offline_access` sú akceptované; pole `patient` v odpovedi tokenu je kontext spustenia.

Iné typy grantov: `client_credentials` (dôverné klienty; funguje ako API kľúč) a grant identity prvej strany (iba dôveryhodné klienty).

### Vaša značka na stránke súhlasu

Aplikácia môže na hosťovanej stránke súhlasu zobraziť svoje logo a akcentovú farbu. Nastavte ich v konzole
(Aplikácie → Značka) alebo pomocou admin API:

```http
PUT /admin/applications/{application_id}/branding
{"logo": "data:image/png;base64,…", "brand_color": "#1D4ED8"}
```

- **Logo:** obrázok PNG, JPEG alebo WebP ako dátový URI, do 64 KB. Kontroluje sa obsah, nie deklarovaný typ;
  SVG nie je akceptovaný. Obrázok sa uloží s aplikáciou a vloží na stránku, takže stránka súhlasu
  nevykonáva žiadne požiadavky na vaše servery.
- **Akcentová farba:** `#RRGGBB`, používa sa pre hlavné tlačidlo. Biely text na nej musí zachovať kontrast najmenej
  4,5:1 (WCAG AA); svetlejšie farby sú odmietnuté.
- Pole, ktoré vynecháte, zostane tak, ako je; `null` alebo prázdny reťazec ho odstráni.

Zvyšok stránky sa nemení: riadok "Zabezpečené platformou Anpheros", zoznam v bežnom jazyku
toho, čo aplikácia žiada, a TEST banner na sandbox projektoch zostávajú, takže ľudia vždy vedia, že
súhlas spravuje Anpheros. AI konektory (MCP) vždy zobrazujú stránku Anpheros bez značky aplikácie.

### Oblasti (Scopes)
SMART v2 oblasti pacienta: `patient/<Type>.<cruds>` s voliteľným filtrom `?category=<code>` (jediný filter, ktorý server vynucuje; akýkoľvek iný filter je odmietnutý v čase autorizácie). `patient/*.rs` číta všetko; `offline_access` pridáva obnovovací token. Demografické údaje pacienta a adresár sú vždy čitateľné pod grantom. Typ zdroja mimo grantu vráti 403; pacient mimo grantu vráti 404.

### Životný cyklus súhlasu
Súhlasy automaticky vypršia, pacient ich môže kedykoľvek odvolať (obrazovka Pripojenia / `/me`) a každé čítanie pod súhlasom je zaznamenané s ID aplikácie. Webhooky `consent.granted` / `consent.revoked` informujú projekt.

## Chyby
401 neznámy/expirujúci poverovací údaj · 403 poverovací údaj existuje, ale nemusí to umožňovať · 404 zdroj neexistuje *pre vás* · 429 obmedzený počet požiadaviek (`Retry-After`). Pozri [`errors.md`](https://developers.anpheros.com/sk/guides/errors).
