Overview

SMART Health IT 最早在《新英格蘭醫學雜誌》的一篇文章中推出,提出編寫一次應用程序,然後讓它在醫療保健系統的任何地方運行,制定通用 API。 SMART 已成為 21st Century Cures Act2020 Final Rule from the ONC認證要求項目。

Pre-erequirement

需要先熟悉 OAuth 2.0 的流程。

Discovery document

SMART 定義了一個標準的 metadata 端點 /.well-known/smart-configuration 稱為 discovery document 用來告訴使用者仲介訊息:

  • Server Capabilities (server 可以做什麼)
  • Configuration (配置?)

認證與授權

授權(Authorization)

SMART 定義兩種 Client 端 App 授權模式,差別主要在於被授權是否有使用者參與:

  • Authorization via SMART App Launch
    透過 1.EHR 或其他健康軟體的登入 session 或2.使用者手動授權,將用戶權限委託給面向使用者的 App本身連接到 FHIR Server 存取資源,被授權方獲得授權方分向的資訊稱為 lanuch context (例如用戶資訊)。
  • Authorization via SMART Backend Services
    授權在與用戶無關的情況下完成。

認證(Authentication)

SMART 定義兩種 Client 端 App 認證模式,也就是對稱/不對稱加密,官方建議是使用不對稱加密:

  • Asymmetric (“private key JWT”) authentication
  • Symmetric (“client secret”) authentication

範圍(scopes)

SMART 的scopes允許 client 程式請求委派(delegate)一組特定的訪問權限,而委派的權限所受到的限制來自兩種機制:

  • 底層系統政策(policy)
    假如 client 使用 SMART App Launch 向使用者請求 user/*.cruds scope,使用者授予後 client
  • 底層系統本身權限(permission)的限制。

使用 scopes 限制被授權的 client 可存取範圍 例如:

  • SMART App Launch 的程式被授權 user/Encounter.rs 可讀取、搜尋授權使用者(launch context)可存取的 Encounter 資源。
  • SMART Backend Services 的程式被授權 system/Encounter.rs 可讀取、搜尋該 App 全部或被設定可存取的 Encounter 資源。

例如最常見的 Scope:

Scope權限
patient/*.rs可以對屬於當下病患(patient)任何資源(*)進行搜尋/讀取(rs)
user/*.cruds可以對屬於當下使用者(user)任何資源(*)進行搜尋和CRUD(cruds)
openid
fhirUser
可以存取當前登入的使用者(user)資訊
launch當 app 從 EHR 啟動,app 獲得 launch context
launch/patient當 app 不是從 EHR 啟動,app 在啟動時請求選擇患者(?)
offline_access可申請一組即使 access token 失效、使用者離線仍有效refresh_token
online_access可申請一組需使用者在線才有效refresh_token

Token Introspection

SMART 流程中,Authorization Server 需要定義一個 Token Introspection API,用來檢查 token 的 scopes、用戶、病患、等等 token 詳細訊息,透過這個模式讓 Resource ServerAuthorization Server 解耦。
實作可以參考 RFC7662 - OAuth 2.0 Token Introspection

Request

請求範例:使用POST、需要使用者驗證。

POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

token=mF_9.B5f-4.1JqM&token_type_hint=access_token

參數說明:

欄位必要說明
token必要token 本人
token_type_hint選用token 類型提示

Response

回應範例:JSON

欄位必要說明
activeREQUIREDtoken 是否可用
scopeOPTIONAL授權範圍
client_idOPTIONAL要求授權的 client (SMART App)
usernameOPTIONALuser ID
token_typeOPTIONALtoken 類型(access/refresh..)
expOPTIONALexpiration time (JWT Registered Claims)
iatOPTIONALissued at (JWT Registered Claims)
nbfOPTIONALnot before (JWT Registered Claims)
subOPTIONALsubject (JWT Registered Claims)
audOPTIONALaudience (JWT Registered Claims)
issOPTIONALissuer (JWT Registered Claims)
jtiOPTIONALJWT ID (JWT Registered Claims)

Reference