# SMART on FHIR ile hasta rızasını uygulama

> Öğretici: SMART on FHIR, OAuth 2.1 ve PKCE adım adım — keşif, uygulama kaydı, rıza ekranı, belirteç değişimi, kapsamların uygulanması, yenileme rotasyonu ve iptal — ve Anpheros'un neyi uyguladığı.

Source: https://developers.anpheros.com/tr/guides/smart-on-fhir-backend

**SMART on FHIR, bir uygulamanın bir kişinin FHIR kaydına erişmesi için izin almasının standart yoludur: yetkilendirme için PKCE ile OAuth 2.1, tam olarak neyin okunabileceğini veya yazılabileceğini belirten kapsamlar ve uygulamanın nereye gideceğini bildiren bir keşif belgesi.** Bu öğretici, tüm akışı Anpheros'a karşı adım adım `curl` ile çalıştırır: keşif, bir uygulama kaydetme, kişiyi rıza ekranına gönderme, kodu değiştirme, verilen kapsamlar dahilinde API'yi çağırma, yenileme ve kişinin erişimi iptal ettiğinde ne olacağı. Anpheros, SMART on FHIR arka ucudur: yetkilendirme sunucusunu, rıza ekranını ve FHIR R4 sunucusunu barındırır, böylece kendi oturum açma veya rıza arayüzünüzü yazmazsınız.

## Neden API anahtarı yerine onay

Bir API anahtarı, projenizin oluşturduğu hastalara ulaşır. Bir kişinin mevcut kaydı (diğer uygulamalar, klinikler ve laboratuvarlar tarafından toplanan kendi verileri) paylaşabileceği kişiye aittir. SMART on FHIR ile:

- Kişi, hangi uygulamanın, neyi okumak veya yazmak istediğini, hangi amaçla ve ne kadar süreyle istediğini kendi dilinde görür;
- Uygulamanız yalnızca o kaynak türlerini ve eylemleri, yalnızca o tek kayıt için alır;
- Her erişim kaydedilir ve kişi tarafından görülebilir, kişi istediği zaman erişimi iptal edebilir;
- Yetkilendirme ayrıca bir FHIR `Consent` kaynağı olarak saklanır.

Bunun arkasındaki model [Hasta onayı ile Sağlık Hizmetleri API'si](https://developers.anpheros.com/tr/guides/healthcare-api-patient-consent) ve [Onay ve erişim modeli](https://developers.anpheros.com/tr/guides/consent) belgelerinde açıklanmıştır.

## Adım 1: Keşif

```bash
curl https://platform.anpheros.com/fhir/R4/.well-known/smart-configuration
```

Yanıt, uç noktaları ve sunucunun neleri desteklediğini listeler (kısaltılmış):

```json
{"issuer": "https://platform.anpheros.com",
 "authorization_endpoint": "https://platform.anpheros.com/oauth/authorize",
 "token_endpoint": "https://platform.anpheros.com/oauth/token",
 "revocation_endpoint": "https://platform.anpheros.com/oauth/revoke",
 "code_challenge_methods_supported": ["S256"],
 "scopes_supported": ["patient/*.rs", "patient/Patient.r", "patient/Observation.rs", "patient/Observation.rs?category=laboratory",
                      "patient/Observation.rs?category=vital-signs", "patient/Observation.c", "patient/Condition.rs",
                      "patient/MedicationStatement.rs", "patient/DocumentReference.rs", "patient/AllergyIntolerance.rs",
                      "offline_access", "launch/patient", "openid", "fhirUser"],
 "capabilities": ["launch-standalone", "client-public", "client-confidential-symmetric", "permission-patient",
                  "permission-offline", "context-standalone-patient", "sso-openid-connect"]}
```

SMART istemci kütüphaneleri bu belgeyi okur ve yapılandırılması gereken başka bir şeye ihtiyaç duymaz.

## Adım 2: Uygulamanızı Kaydetme

[Gösterge Paneli](https://platform.anpheros.com/dashboard/) içinde projenizi açın ve yönlendirme URI'si ile bir uygulama ekleyin. Veya Yönetici API'si aracılığıyla:

```bash
curl -X POST https://platform.anpheros.com/admin/projects/$PROJECT/applications \
     -H "Authorization: Bearer $FIREBASE_ID_TOKEN" -H "Content-Type: application/json" -d '{
  "name": "CardioAI", "client_type": "public",
  "redirect_uris": ["https://cardio.example/callback"],
  "purpose": "cardiology follow-up", "privacy_url": "https://cardio.example/privacy"
}'
```

```json
{"id": "app_…", "name": "CardioAI", "client_type": "public", "client_id": "client_Hg6CknNkYlMgN190", "client_secret": null,
 "redirect_uris": ["https://cardio.example/callback"], "purpose": "cardiology follow-up", "status": "active", …}
```

Gizli anahtarı tutamayan ve PKCE'ye güvenen mobil ve tarayıcı uygulamaları için `public` kullanın. Bir sunucu için `confidential` kullanın; `client_secret` bir kez gösterilir. İsim, amaç ve gizlilik bağlantısı, kişinin onay ekranında gördüğü bilgilerdir.

## Adım 3: kişiyi onay ekranına yönlendirin

Bir PKCE çifti oluşturun. Doğrulayıcı sizde kalır; yalnızca karması iletilir:

```bash
VERIFIER=$(openssl rand -base64 64 | tr -d '=+/\n' | cut -c1-64)
CHALLENGE=$(printf %s "$VERIFIER" | openssl dgst -sha256 -binary | openssl base64 | tr '+/' '-_' | tr -d '=')
```

Ardından bu adresi kişinin tarayıcısında açın (okunabilirlik için satır sonları eklenmiştir):

```
https://platform.anpheros.com/oauth/authorize?response_type=code
  &client_id=client_Hg6CknNkYlMgN190
  &redirect_uri=https://cardio.example/callback
  &scope=openid fhirUser patient/Observation.rs?category=laboratory patient/Condition.rs offline_access
  &state=8c1e…               ← a random value you check on return
  &code_challenge=$CHALLENGE&code_challenge_method=S256
  &purpose=treatment&lang=en
```

İhtiyacınız olan en az şeyi isteyin. Bu uygulama laboratuvar sonuçlarını ve teşhisleri okur, başka hiçbir şeyi değil. `offline_access` bir yenileme belirteci verir, böylece kişi her 30 dakikada bir tekrar onaylamak zorunda kalmaz.

Kişi Anpheros'a giriş yapar, isteği açık dilde okur, hangi kaydı paylaşacağını (kendi kaydı, baktığı bir aile üyesinin kaydı veya uygulamanızın kendisi için oluşturduğu kayıt) ve erişimin ne kadar süreceğini seçer, ardından izin verir veya reddeder. Yönlendirme URI'nize geri dönerler:

```
https://cardio.example/callback?code=…&state=8c1e…
```

Kodu kullanmadan önce `state`'in daha önce gönderdiğiniz değerle aynı olduğunu kontrol edin.

## Adım 4: Kodu belirteçlerle değiştirin

```bash
curl -X POST https://platform.anpheros.com/oauth/token \
  -d grant_type=authorization_code -d client_id=client_Hg6CknNkYlMgN190 \
  -d code=$CODE -d code_verifier=$VERIFIER -d redirect_uri=https://cardio.example/callback
```

```json
{"access_token": "at_…", "token_type": "Bearer", "expires_in": 1800,
 "scope": "patient/Observation.rs?category=laboratory patient/Condition.rs openid fhirUser offline_access",
 "patient": "82bfd321-6a4d-4aea-943a-a62f4d81d419", "grant_id": "grant_…",
 "id_token": "eyJ…", "refresh_token": "rt_…"}
```

- `scope`, neyin verildiğini listeler. Belirteçlerle birlikte tutun ve yalnızca kapsadığı özellikleri gösterin.
- `patient`, uygulamanız için kaydın kimliğidir. Eşleşen bir kimliktir: başka bir uygulama aynı kişiyi farklı bir kimlik altında görür.
- `id_token`, `fhirUser` talebinin hasta kaynağını adlandırdığı bir OpenID Connect belirtecidir.
- Kod yalnızca bir kez ve yalnızca eşleşen `code_verifier` ile çalışır.

## Adım 5: API'yi kapsamlar dahilinde çağırma

```bash
curl "https://platform.anpheros.com/fhir/R4/Observation?patient=$PATIENT&category=laboratory" -H "Authorization: Bearer $ACCESS_TOKEN"
```

Laboratuvar sonuçları her zamanki gibi gelir. İlaçlar gibi, izin verilenin dışındaki bir şeyi isteyin:

```bash
curl "https://platform.anpheros.com/fhir/R4/MedicationStatement?patient=$PATIENT" -H "Authorization: Bearer $ACCESS_TOKEN"
```

```json
{"resourceType": "OperationOutcome", "issue": [{"severity": "error", "code": "forbidden",
  "diagnostics": "The consent behind this token does not allow 's' on MedicationStatement."}]}
```

Bu bir `403`'dir. İzin verilenler içindeki aramalar da filtrelenir: `Observation.rs?category=laboratory` ile, tüm gözlemler için yapılan bir arama yalnızca laboratuvar olanları döndürür. Bu belirteç için başka hiçbir hasta mevcut değildir (`404`). REST görünümü (`/v1`) ve [bağlam API'si](https://developers.anpheros.com/tr/guides/llm-healthcare-data) aynı kapsamları uygular.

## Adım 6: yenileme

Erişim belirteçleri 30 dakika geçerlidir. Yenileme belirteçleri 30 gün geçerlidir ve her kullanımda döndürülür:

```bash
curl -X POST https://platform.anpheros.com/oauth/token \
  -d grant_type=refresh_token -d client_id=client_Hg6CknNkYlMgN190 -d refresh_token=$REFRESH_TOKEN
```

Yeni bir erişim belirteci ve yeni bir yenileme belirteci alırsınız. Yenisini hemen saklayın. Eski bir yenileme belirtecinin yeniden kullanılması hırsızlık olarak kabul edilir: `400` ile başarısız olur ve tüm izni iptal eder.

## Adım 7: İptal Etme

Kişi, Anpheros'taki erişiminizi istediği zaman iptal edebilir ve siz de, örneğin uygulamanızda bağlantıyı kestiklerinde, kendiniz iptal edebilirsiniz:

```bash
curl -X POST https://platform.anpheros.com/oauth/revoke -d token=$REFRESH_TOKEN -d client_id=client_Hg6CknNkYlMgN190
```

Bundan sonra, o yetkiyle yapılan her çağrı `401` yanıtını verecektir. Bunu, kişinin bağlantının sona erdiğini göstererek ve tekrar bağlanmayı teklif ederek ele alın. Başarısız bir çağrı beklemek zorunda kalmadan öğrenmek için `consent.revoked` [webhook](https://developers.anpheros.com/tr/guides/webhooks) adresine abone olun.

## SDK'ler ile

[TypeScript ve Dart SDK'leri](https://developers.anpheros.com/tr/guides/sdks), 3 ila 6 arasındaki adımları sizin için gerçekleştirir: `OAuthFlow.authorizeUrl`, PKCE çifti oluşturarak, `exchange` geri çağırma sırasında ve otomatik yenileme ile rotasyon yaparak. Tam örnekler: [FHIR arka ucu ile bir yapay zeka sağlık uygulaması nasıl oluşturulur](https://developers.anpheros.com/tr/guides/build-ai-healthcare-app) (TypeScript) ve [Flutter ile bir sağlık uygulaması nasıl oluşturulur](https://developers.anpheros.com/tr/guides/healthcare-app-flutter) (Dart).

## Anpheros Neler Uyguluyor

| SMART'ın Bölümü | Anpheros'ta |
|---|---|
| Keşif | FHIR tabanında `/.well-known/smart-configuration`, desteklenen uç noktalar, kapsamlar ve PKCE yöntemleri ile |
| Başlatma | bağımsız başlatma (uygulama başlar, ardından erişim ister); klinik bir sistem içinden EHR başlatma sunulmamaktadır |
| Yetkilendirme | PKCE gerektiren OAuth 2.1, yetkilendirme kodu akışı |
| Kapsamlar | SMART v2 hasta kapsamları, kategori filtreli `patient/<Resource>.<cruds>`, artı `openid` ve `fhirUser` |
| Kimlik | bir FHIR kaynağı olarak hastayı adlandıran bir OpenID Connect `id_token` |
| Onay | hastanın dilinde barındırılan bir onay ekranı, hastanın seçtiği süre ile, bir FHIR `Consent` olarak yansıtılır |
| Tokenlar | 30 dakikalık erişim tokenları, onaya bağlı dönen 30 günlük yenileme tokenları, iptal |
| Uyumluluk | yetenek beyanı SMART güvenlik hizmetini beyan eder; Inferno SMART Uygulama Başlatma STU2 test kitinin "Bağımsız Başlatma" grubu 22 testin 22'sini geçer (28 Eylül 2026 çalıştırması); diğer Inferno grupları ve test kitleri çalıştırılmamıştır |

Yazma da aynı şekilde çalışır: kapsamlar (`patient/Observation.c`, `.u`, `.d`) uygulamanızın kayıt içinde oluşturmasına, güncellemesine veya silmesine olanak tanır. Yazılan her şey, yazar olarak uygulamanızı taşır, bir idempotency anahtarıyla denemeler bir ölçümü asla tekrarlamaz ve silmeler yumuşaktır ve geçmişi saklar ([Medical data API](https://developers.anpheros.com/tr/guides/medical-data-api)).

## Henüz Neler Yok

- EHR başlatma (bir hastane sistemi içinden bir başlatma bağlamıyla açılan uygulama).
- Arka uç hizmetleri için `system/` kapsam; kuruluşlar bunun yerine API anahtarlarını kullanır.
- Toplu Veri dışa aktarma (`$export`); bir hastaya ilişkin `$everything` mevcuttur.

Bunlar, [Sürüm Oluşturma ve Devre Dışı Bırakma](https://developers.anpheros.com/tr/guides/versioning) bölümündeki diğerleriyle birlikte listelenmiştir ve yetenek ifadesi her zaman yetkili kaynaktır.

## Sıkça Sorulan Sorular

### SMART on FHIR nedir?
OAuth 2.0/2.1 ve OpenID Connect üzerine kurulu açık bir standarttır. Bir uygulamanın bir FHIR kaydına erişim talebinde nasıl bulunacağını, bu erişimi hangi kapsamların tanımladığını ve sunucunun uç noktalarını nasıl duyurduğunu tanımlar. SMART özellikli herhangi bir istemci kütüphanesi, SMART özellikli herhangi bir sunucuyu kullanabilir.

### PKCE'ye ihtiyacım var mı?
Evet. Anpheros, hem genel hem de gizli istemciler için her yetkilendirme kodu akışı için `S256` ile PKCE gerektirir. Bu, ele geçirilen bir yetkilendirme kodunun başkası tarafından kullanılmasını engeller.

### Kişi hayır derse ne olur?
Yönlendirme URI'nize `error=access_denied` ve `state`'niz ile ve kod olmadan dönerler. Özelliğin ne gerektirdiğini açıklayın ve tekrar denemelerine izin verin; bir hibe dışındaki çağrılar her zaman `403` ile yanıt verir.

### Bir ebeveyn bir çocuk için onay verebilir mi?
Evet. Onay ekranında bir kişi, hesabına bağlıysa çocuğunki gibi ilgilendiği bir kaydı seçebilir. Hibe yalnızca o kayda uygulanır.

## İlgili Konular

- [Kimlik Doğrulama ve OAuth](https://developers.anpheros.com/tr/guides/authentication): API anahtarları, belirteçler ve ömürleri hakkında ayrıntılı bilgi
- [Hasta Rızası ile Sağlık API'si](https://developers.anpheros.com/tr/guides/healthcare-api-patient-consent): Rızanın uygulamanızın tasarımında ne gibi değişikliklere yol açtığı
- [Rıza ve Erişim Modeli](https://developers.anpheros.com/tr/guides/consent)
- [FHIR Platformu](https://developers.anpheros.com/tr/guides/fhir)
- [Sağlık Uygulaması Oluşturma](https://developers.anpheros.com/tr/guides/build-a-healthcare-app)
