Lesson 0019 · FHIR · Modul SMART · ±20 menit

Scopes patient/, user/, system/; Backend Services untuk job Node

Sintaks scope SMART v2, konteks dan identitas, lalu Backend Services untuk service tanpa user

Target lesson ini: Anda bisa membaca scope seperti patient/Observation.rs (patient/ vs user/ vs system/, v1 vs v2, openid fhirUser, offline_access) dan menjelaskan alur Backend Services: client_credentials + JWT assertion, scope system/, token pendek tanpa refresh token.

Sebelumnya, di lesson 0018: app menukar code + code_verifier dan menerima access token beserta scope yang diberikan. Lesson ini membedah scope itu, lalu alur tanpa user.

4. Scopes: patient/, user/, system/, dan .cruds

Sintaks scope resource: (patient | user | system) / (ResourceType | *) . (subset dari cruds) [?param=value]. [1]

BagianArti
patient/data tentang satu pasien yang sedang dalam konteks. "what and not who": siapa pasiennya ditentukan oleh launch context
user/data yang bisa diakses user yang login (bukan hanya data tentang user itu)
system/data yang client sendiri diizinkan akses, tanpa user (Backend Services)
c r u d screate, read (termasuk vread, history instance), update (termasuk patch), delete, search. Harus urut: .rs sah, .dus tidak

Kutipan tabel: [1]

Latihan 4 — Scopes

5. Backend Services: job Node tanpa user (dan kaitannya dengan Bulk Data)

Kalau tidak ada user yang mengotorisasi di runtime (data warehouse, sinkronisasi pasien baru, monitoring lab), pakai SMART Backend Services. Profile ini "is designed to work with FHIR Bulk Data Access", jadi inilah cara service Node di lesson 0013 mendapat token untuk $export. [3]

  1. Sekali di awal: daftarkan client dengan public key (JWKS atau URL JWKS). Private key tetap di server Anda. [4]
  2. Setiap butuh token: buat JWT sekali pakai, ditandatangani private key (SHOULD RS384 atau ES384): iss = sub = client_id, aud = token URL, exp maksimal 5 menit ke depan, jti unik (mencegah replay). [4]
  3. POST ke token endpoint: grant_type=client_credentials, client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer, client_assertion=<JWT>, scope=system/…. [3]
  4. Token SHALL berumur pendek, expires_in SHOULD NOT melebihi 300 detik, dan refresh token SHOULD NOT diterbitkan: minta token baru saat perlu. [3]
// Payload JWT assertion (contoh IG); header: { "typ": "JWT", "alg": "RS384", "kid": "eee9f17a..." }
{
  "iss": "https://bili-monitor.example.com",          // client_id
  "sub": "https://bili-monitor.example.com",          // client_id
  "aud": "https://authorize.smarthealthit.org/token", // token URL
  "exp": 1422568860,                                  // ≤ 5 menit dari sekarang
  "jti": "random-non-reusable-jwt-id-123"
}

Padanan JS: ini mirip "service account" Google Cloud (JWT ditandatangani private key, ditukar dengan access token), bukan login user. Bedanya dengan app launch: tidak ada redirect, tidak ada PKCE, tidak ada patient context; scope-nya system/ dan dibatasi oleh izin yang sudah diatur saat registrasi. [3]

Latihan 5 — Backend Services

Latihan lisan — Jawab lisan

Pasang timer, jawab dengan suara keras seolah sedang interview, baru buka jawaban contoh. Soal ini juga ada di bank soal dan bisa ditarik review 0027.

"Service Node kami perlu menarik data populasi tiap malam lewat Bulk Data $export. Bagaimana autentikasinya?" (60 detik)
Bandingkan dengan jawaban contoh dan checklist-nya

"Itu kasus SMART Backend Services, karena tidak ada user di runtime. Sekali di awal kami mendaftarkan client dengan public key, berupa JWKS atau URL JWKS; private key tetap di server kami, misalnya di secret manager. Setiap butuh token, service membuat JWT sekali pakai: iss dan sub = client_id, aud = token URL, exp maksimal 5 menit, jti unik, ditandatangani RS384 atau ES384. Lalu POST ke token endpoint dengan grant_type=client_credentials, client_assertion, dan scope system/ sesempit mungkin, misalnya system/Patient.rs system/Observation.rs. Token-nya pendek, sekitar 5 menit, tanpa refresh token, jadi selama polling $export yang lama kami minta token baru saat kedaluwarsa."

Checklist: apakah Anda menyebut…

  • Backend Services karena tidak ada user yang mengotorisasi?
  • registrasi public key (JWKS), private key tetap di server?
  • JWT assertion: iss/sub = client_id, aud = token URL, exp ≤ 5 menit, jti unik?
  • ditandatangani RS384 atau ES384?
  • grant_type=client_credentials + client_assertion, scope system/ seminimal mungkin?
  • token pendek (≤ 300 detik), tanpa refresh token: minta token baru saat perlu?

Lulus kalau minimal 4 dari 6.

Berikutnya, lesson 0020: semua alur ini dipakai dari React dengan fhirclient, lalu bagaimana menjaga token dan PHI di browser.

Istilah: GLOSSARY.md (bagian "Keamanan dan SMART on FHIR") · Sumber: RESOURCES.md

Sumber: [1] Scopes and Launch Context · [2] App Launch: Launch and Authorization · [3] Backend Services · [4] Client Authentication: Asymmetric