# Autentizace a OAuth

> API klíče, OAuth 2.1 s PKCE (SMART on FHIR standalone launch), OpenID Connect id_token, SMART v2 patient scopes, životnosti tokenů a životní cyklus souhlasu.

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

Platforma Anpheros přijímá tři druhy pověření. Každý požadavek nese přesně jedno.

| Pověření | Vypadá jako | Kdo | Vidí |
|---|---|---|---|
| API klíč | `sk_test_…` (sandbox) / `sk_live_…` (production) | server projektu | pacienti, které projekt vytvořil (v sandboxu, včetně vlastní kopie 30 syntetických pacientů) |
| OAuth access token | `at_…` | aplikace jednající za jednoho pacienta na základě souhlasu | pouze tohoto pacienta, v rámci udělených SMART scopes |
| Firebase ID token | JWT | vývojář v dashboardu nebo pacient v sekci "Connections" | své vlastní organizace / své vlastní záznamy |

Odešlete jej jako `Authorization: Bearer <credential>` (API klíče fungují také jako `X-Api-Key`).

## API klíče
- Vytvořeny v dashboardu nebo přes `POST /admin/projects/{id}/keys`; zobrazeny jednou; uloženy jako SHA-256 hash.
- Rozsahy (Scopes): `read`, `write`. Klíč nikdy nepřekročí prostředí svého projektu (`sk_test_` nemůže přistupovat k produkčním datům a naopak).
- Limit požadavků na klíč (výchozí 600/min) je vynucován napříč platformou (sdílené úložiště), s `Retry-After` na 429. Existuje také limit 600/min na IP adresu.
- Volitelné hlavičky při zápisu: `X-Anpheros-Author-Type`, `X-Anpheros-Author-Ref`, `X-Anpheros-Source-System`, `X-Anpheros-Origin-Id`, `X-Anpheros-Acting-As` (Practitioner/PractitionerRole **z vašeho vlastního adresáře**), `X-Anpheros-On-Behalf-Of` (Organization z vašeho vlastního adresáře). Tyto hlavičky vyplňují Provenance.

## OAuth 2.1 (SMART on FHIR, standalone launch)
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 hostovanou stránku souhlasu. PKCE S256 je povinné; `redirect_uri` musí být registrováno přesně.
2. Pacient se přihlásí (Google nebo e-mail přes Firebase), vybere záznam (svůj nebo závislé osoby), dobu trvání (30/90/180/365 dní) a udělí souhlas. Platforma vydá jednorázový kód (10 minut).
3. `POST /oauth/token` s `grant_type=authorization_code&code=…&code_verifier=…&redirect_uri=…&client_id=…` (důvěrní klienti přidávají `client_secret`).
   Odpověď: `access_token` (30 min), `refresh_token` (30 dní, rotující), `patient` (vaše párové ID pro záznam), `grant_id`, `scope`.
4. Obnovení: `grant_type=refresh_token`. Každý refresh token je na jedno použití. **Předložení použitého refresh tokenu zruší celou řetězovou vazbu** (detekce krádeže). Paralelní duplikát požadavku na obnovení je odmítnut a může také zrušit řetězovou vazbu, proto nikdy nerotujte souběžně.
5. Zrušení: `POST /oauth/revoke` (token + client_id). Zrušení refresh tokenu také zruší jeho přístupové tokeny.

Odpovědi tokenů nesou `Cache-Control: no-store` a `Pragma: no-cache`, jak vyžaduje SMART.

### OpenID Connect (`openid fhirUser`)
Požádejte o `openid fhirUser` spolu s rozsahy pacienta a odpověď tokenu bude také obsahovat `id_token`: JWT podepsaný pomocí RS256, s `iss` (základní URL platformy), `sub` (vaše párové ID pro osobu), `aud` (vaše `client_id`), `exp`, `iat` a `fhirUser` — absolutní URL zdroje Pacienta dané osoby, čitelné s přístupovým tokenem, který jste právě obdrželi. Discovery se nachází na `GET /.well-known/openid-configuration`; veřejné klíče na `GET /oauth/jwks` (`kid` v hlavičce tokenu). Parametr `nonce` zatím není podporován (je volitelný v toku autorizačního kódu). `launch/patient` a `offline_access` jsou akceptovány; pole `patient` v odpovědi tokenu je kontext spuštění.

Jiné typy udělení: `client_credentials` (důvěrní klienti; chová se jako API klíč) a udělení identity první strany (pouze důvěryhodní klienti).

### Vaše značka na stránce souhlasu

Aplikace může na hostované stránce souhlasu zobrazit své logo a akcentní barvu. Nastavte je v konzoli
(Aplikace → Značka) nebo pomocí administračního API:

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

- **Logo:** obrázek PNG, JPEG nebo WebP jako datový URI, až 64 KB. Kontroluje se obsah, nikoli deklarovaný typ;
  SVG není akceptován. Obrázek je uložen s aplikací a vložen na stránku, takže stránka souhlasu
  neodesílá žádné požadavky na vaše servery.
- **Akcentní barva:** `#RRGGBB`, používaná pro hlavní tlačítko. Bílé písmo na ní musí zachovat kontrast nejméně
  4,5:1 (WCAG AA); světlejší barvy jsou odmítnuty.
- Pole, které vynecháte, zůstane tak, jak je; `null` nebo prázdný řetězec jej odstraní.

Zbytek stránky se nemění: řádek "Zabezpečeno platformou Anpheros", seznam v prostém jazyce
požadovaných položek aplikací a banner TEST na sandbox projektech zůstávají, takže lidé mohou vždy poznat, že
souhlas drží Anpheros. Konektory AI (MCP) vždy zobrazují stránku Anpheros bez značky aplikace.

### Scopes
SMART v2 rozsahy pacienta: `patient/<Type>.<cruds>` s volitelným filtrem `?category=<code>` (jediný filtr, který server vynucuje; jakýkoli jiný filtr je odmítnut v době autorizace). `patient/*.rs` čte vše; `offline_access` přidává refresh token. Demografické údaje pacienta a adresář jsou vždy čitelné v rámci udělení. Typ zdroje mimo udělení vrací 403; pacient mimo udělení vrací 404.

### Životní cyklus souhlasu
Souhlasy automaticky vyprší, mohou být kdykoli zrušeny pacientem (obrazovka Připojení / `/me`) a každé čtení v rámci souhlasu je zaznamenáno s ID aplikace. Webhooky `consent.granted` / `consent.revoked` informují projekt.

## Chyby
401 unknown/expired credential · 403 the credential exists but may not do this · 404 the resource does not exist *for you* · 429 rate limited (`Retry-After`). Viz [`errors.md`](https://developers.anpheros.com/cs/guides/errors).
