# Αυθεντικοποίηση και OAuth

> Κλειδιά API, OAuth 2.1 με PKCE (SMART on FHIR αυτόνομη εκκίνηση), OpenID Connect id_token, SMART v2 patient scopes, διάρκειες ζωής token και ο κύκλος ζωής συναίνεσης.

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

Η πλατφόρμα Anpheros δέχεται τρεις τύπους διαπιστευτηρίων. Κάθε αίτημα φέρει ακριβώς ένα.

| Διαπιστευτήριο | Μοιάζει με | Ποιος | Βλέπει |
|---|---|---|---|
| Κλειδί API | `sk_test_…` (sandbox) / `sk_live_…` (production) | ο διακομιστής ενός project | τους ασθενείς που δημιούργησε το project (στο sandbox, συμπεριλαμβανομένου του δικού του αντιγράφου 30 συνθετικών ασθενών) |
| OAuth access token | `at_…` | μια εφαρμογή που ενεργεί για έναν ασθενή υπό συναίνεση | μόνο αυτόν τον ασθενή, εντός των χορηγηθέντων SMART scopes |
| Firebase ID token | JWT | ένας προγραμματιστής στο dashboard, ή ένας ασθενής στο "Συνδέσεις" | τους δικούς του οργανισμούς / τα δικά του αρχεία |

Στείλτε το ως `Authorization: Bearer <credential>` (τα κλειδιά API λειτουργούν επίσης ως `X-Api-Key`).

## Κλειδιά API
- Δημιουργούνται στον πίνακα ελέγχου ή μέσω `POST /admin/projects/{id}/keys`· εμφανίζονται μία φορά· αποθηκεύονται ως κατακερματισμός SHA-256.
- Εύρος (Scopes): `read`, `write`. Ένα κλειδί δεν διασχίζει ποτέ το περιβάλλον του έργου του (το `sk_test_` δεν μπορεί να φτάσει σε δεδομένα παραγωγής και αντίστροφα).
- Το όριο ρυθμού ανά κλειδί (προεπιλογή 600/λεπτό) επιβάλλεται σε ολόκληρη την πλατφόρμα (κοινό κατάστημα), με `Retry-After` σε 429. Υπάρχει επίσης όριο ανά IP 600/λεπτό.
- Προαιρετικές κεφαλίδες σε εγγραφές (writes): `X-Anpheros-Author-Type`, `X-Anpheros-Author-Ref`, `X-Anpheros-Source-System`, `X-Anpheros-Origin-Id`, `X-Anpheros-Acting-As` (ένας Practitioner/PractitionerRole **του δικού σας καταλόγου**), `X-Anpheros-On-Behalf-Of` (ένας Organization του δικού σας καταλόγου). Συμπληρώνουν το Provenance.

## OAuth 2.1 (SMART on FHIR, αυτόνομη εκκίνηση)
Ανακάλυψη: `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]`
   Εμφανίζει την φιλοξενούμενη σελίδα συναίνεσης. Το PKCE S256 είναι υποχρεωτικό· το `redirect_uri` πρέπει να είναι εγγεγραμμένο ακριβώς.
2. Ο ασθενής συνδέεται (Google ή email μέσω Firebase), επιλέγει τον φάκελο (δικό του ή εξαρτώμενου), τη διάρκεια (30/90/180/365 ημέρες) και επιτρέπει. Η πλατφόρμα εκδίδει έναν κωδικό μίας χρήσης (10 λεπτά).
3. `POST /oauth/token` με `grant_type=authorization_code&code=…&code_verifier=…&redirect_uri=…&client_id=…` (εμπιστευτικοί πελάτες προσθέτουν `client_secret`).
   Απάντηση: `access_token` (30 λεπτά), `refresh_token` (30 ημέρες, εναλλασσόμενο), `patient` (το pairwise id σας για τον φάκελο), `grant_id`, `scope`.
4. Ανανέωση: `grant_type=refresh_token`. Κάθε token ανανέωσης είναι μίας χρήσης. **Η παρουσίαση ενός χρησιμοποιημένου token ανανέωσης ανακαλεί ολόκληρη την αλυσίδα** (ανίχνευση κλοπής). Μια παράλληλη διπλή αίτηση ανανέωσης απορρίπτεται και μπορεί επίσης να ανακαλέσει την αλυσίδα, οπότε μην περιστρέφετε ποτέ ταυτόχρονα.
5. Ανάκληση: `POST /oauth/revoke` (token + client_id). Η ανάκληση ενός token ανανέωσης ανακαλεί επίσης τα access tokens του.

Οι απαντήσεις token φέρουν `Cache-Control: no-store` και `Pragma: no-cache`, όπως απαιτεί το SMART.

### OpenID Connect (`openid fhirUser`)
Ζητήστε `openid fhirUser` παράλληλα με τα patient scopes και η απάντηση token περιέχει επίσης ένα `id_token`: ένα JWT υπογεγραμμένο με RS256, με `iss` (την βασική διεύθυνση URL της πλατφόρμας), `sub` (το pairwise id σας για το άτομο), `aud` (το `client_id` σας), `exp`, `iat` και `fhirUser` — την απόλυτη διεύθυνση URL του πόρου Patient του ατόμου, αναγνώσιμη με το access token που μόλις λάβατε. Η ανακάλυψη βρίσκεται στο `GET /.well-known/openid-configuration`· τα δημόσια κλειδιά στο `GET /oauth/jwks` (`kid` στην κεφαλίδα του token). Η παράμετρος `nonce` δεν υποστηρίζεται ακόμη (είναι προαιρετική στη ροή authorization-code). Γίνονται αποδεκτά τα `launch/patient` και `offline_access`· το πεδίο `patient` της απάντησης token είναι το launch context.

Άλλοι τύποι χορήγησης: `client_credentials` (εμπιστευτικοί πελάτες· συμπεριφέρεται σαν κλειδί API), και η χορήγηση ταυτότητας πρώτου κόμματος (μόνο έμπιστοι πελάτες).

### Η επωνυμία σας στη σελίδα συναίνεσης

Μια εφαρμογή μπορεί να εμφανίσει το λογότυπο και το χρώμα έμφασης στη φιλοξενούμενη σελίδα συναίνεσης. Ρυθμίστε τα στην κονσόλα
(Εφαρμογές → Επωνυμία) ή με το admin API:

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

- **Λογότυπο:** μια εικόνα PNG, JPEG ή WebP ως data URI, έως 64 KB. Ελέγχεται το περιεχόμενο, όχι ο δηλωμένος τύπος·
  το SVG δεν γίνεται αποδεκτό. Η εικόνα αποθηκεύεται με την εφαρμογή και ενσωματώνεται στη σελίδα, οπότε η σελίδα συναίνεσης
  δεν πραγματοποιεί αίτηση στους διακομιστές σας.
- **Χρώμα έμφασης:** `#RRGGBB`, χρησιμοποιείται για το κύριο κουμπί. Το λευκό κείμενο πάνω του πρέπει να διατηρεί αντίθεση τουλάχιστον
  4.5:1 (WCAG AA)· τα πιο ανοιχτά χρώματα απορρίπτονται.
- Ένα πεδίο που παραλείπετε παραμένει ως έχει· `null` ή μια κενή συμβολοσειρά το αφαιρεί.

Το υπόλοιπο της σελίδας δεν αλλάζει: η γραμμή "Secured by Anpheros Platform", η λίστα απλής γλώσσας
για το τι ζητά η εφαρμογή, και το banner TEST σε έργα sandbox παραμένουν, ώστε οι άνθρωποι να μπορούν πάντα να καταλάβουν ότι
η συναίνεση διατηρείται από την Anpheros. Οι συνδέσεις AI (MCP) εμφανίζουν πάντα τη σελίδα Anpheros χωρίς επωνυμία εφαρμογής.

### Scopes
SMART v2 patient scopes: `patient/<Type>.<cruds>` με προαιρετικό φίλτρο `?category=<code>` (το μόνο φίλτρο που επιβάλλει ο διακομιστής· οποιοδήποτε άλλο φίλτρο απορρίπτεται κατά την ώρα της εξουσιοδότησης). Το `patient/*.rs` διαβάζει τα πάντα· το `offline_access` προσθέτει ένα token ανανέωσης. Τα δημογραφικά στοιχεία του ασθενούς και ο κατάλογος είναι πάντα αναγνώσιμα υπό μια χορήγηση. Ένας τύπος πόρου εκτός της χορήγησης επιστρέφει 403· ένας ασθενής εκτός της χορήγησης επιστρέφει 404.

### Κύκλος ζωής συναίνεσης
Οι συναινέσεις λήγουν αυτόματα, μπορούν να ανακληθούν από τον ασθενή ανά πάσα στιγμή (οθόνη Συνδέσεις / `/me`), και κάθε ανάγνωση υπό μια συναίνεση καταγράφεται με το id της εφαρμογής. Τα Webhooks `consent.granted` / `consent.revoked` ειδοποιούν το έργο.

## Σφάλματα
401 άγνωστη/λήξασα διαπίστευση · 403 η διαπίστευση υπάρχει αλλά ενδέχεται να μην επιτρέπεται · 404 ο πόρος δεν υπάρχει *για εσάς* · 429 περιορισμός ρυθμού (`Retry-After`). Δείτε [`errors.md`](https://developers.anpheros.com/el/guides/errors).
