アプリケーションの登録
Azure Health Data Services のために Microsoft Entra ID でクライアント アプリケーションを登録する | Microsoft Learn
RBACの設定
※これが重要。ドキュメントに明確に記載されていない。
FHIR サービスの Azure RBAC ロールを構成する – Azure Health Data Services | Microsoft Learn
FHIRサービスのIAMからアプリケーションにFHIRデータライターなどのロールを割り当てる必要がある
FHIR サービスでエクスポート設定を構成する – Azure Health Data Services | Microsoft Learn
また、エクスポートの準備として、FHIRデータエクスポーターロールも割り当てておく
Postman を使用して FHIR サービスにアクセス
Postman を使用して Azure Health Data Services の FHIR サービスにアクセスする | Microsoft Learn
環境変数の設定
- サブスクリプションIDは、サブスクリプションページの概要から取得
- クライアントIDは、登録したアプリケーションのクライアントID
- クライアントシークレットは、アプリケーションにシークレットを追加して取得
- fhirurlは、FHIRサービス概要から取得
- bearerTokenは、空白のまま
metadataの取得
postmanからGET {{fhirurl}}/metadataをリクエストする
レスポンス:
{
"resourceType": "CapabilityStatement",
"url": "https://s3labws1-fhir1.fhir.azurehealthcareapis.com/metadata",
"version": "1.0.0.0",
"name": "Microsoft Azure Healthcare APIs 4.0.91 Capability Statement",
"status": "active",
"experimental": true,
"date": "2024-04-25T08:27:30.6230238+00:00",
"publisher": "Microsoft",
"contact": [
{
"telecom": [
{
"system": "url",
"value": "https://www.microsoft.com"
}
]
}
],
"kind": "capability",
"software": {
"name": "Azure Healthcare APIs",
"version": "4.0.91"
},
"fhirVersion": "4.0.1",
"format": [
"application/fhir+json",
"json"
],
"patchFormat": [
"application/fhir+json",
"application/json-patch+json"
],
"rest": [
{
"mode": "server",
"security": {
"extension": [
{
"extension": [
{
"url": "token",
"valueUri": "https://login.microsoftonline.com/cd88daa1-fdc1-486c-89d1-85c96a503ac3/oauth2/token"
},
{
"url": "authorize",
"valueUri": "https://login.microsoftonline.com/cd88daa1-fdc1-486c-89d1-85c96a503ac3/oauth2/authorize"
}
],
"url": "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris"
}
],
"service": [
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/restful-security-service",
"code": "OAuth"
}
]
}
]
},
"resource": [
{
"type": "Account",
"profile": "http://hl7.org/fhir/StructureDefinition/Account",
"interaction": [
{
"code": "create"
},
{
"code": "read"
},
{
"code": "vread"
},
{
"code": "history-type"
},
{
"code": "history-instance"
},
{
"code": "update"
},
{
"code": "patch"
},
{
"code": "delete"
},
{
"code": "search-type"
}
],
・・・
クライアント資格情報付与タイプでアクセストークンの取得
※どちらかの方法でよい。こちらが簡単
クライアント資格情報付与タイプ(Client Credentials Grant)は、OAuth 2.0プロトコルの一部で、アプリケーションが自己のクライアントIDとシークレットを使用してアクセストークンを取得し、ユーザーの介入なしにAPIへのアクセス権を確立するための方法です。この流れでは、アプリケーションはサーバーに対して直接認証情報を提出し、必要なリソースにアクセスするためのトークンを受け取ります。主にサーバー間の通信やアプリケーションが自己のデータのみを操作する場合に使用されます。
POST https://login.microsoftonline.com/{{tenantid}}/oauth2/tokenを実行する
ボティ:
x-www-form-urlencodedで、以下を設定
grant_type: Client_Credentials
client_id: {{clientid}}
client_secret: {{clientsecret}}
resource: {{fhirurl}}
postmanテスト:
以下を設定することで、環境変数bearerTokenに、レスポンスのアクセストークンが自動で設定される
pm.environment.set("bearerToken", pm.response.json().access_token);
レスポンス:
{
"token_type": "Bearer",
"expires_in": "3599",
"ext_expires_in": "3599",
"expires_on": "1714052977",
"not_before": "1714049077",
"resource": "https://s3labws1-fhir1.fhir.azurehealthcareapis.com",
"access_token": "・・・"
}
認可コード付与タイプでアクセストークン取得
※どちらかの方法でよい
認可コード付与タイプ(Authorization Code Grant)は、OAuth 2.0プロトコルの一つで、クライアントがユーザーの同意を得た後、認可サーバーから認可コードを取得し、そのコードを使用してアクセストークンを取得する流れです。この方法は特にウェブアプリケーションでよく使用され、トークン交換過程で追加のセキュリティ層が導入されるため、セキュリティが強化されます。ユーザーは自分の資格情報を直接クライアントに公開することなく、安全に認証と認可を行うことができます。
アプリケーションの認証で、ウェブのプラットフォームを追加し、リダイレクトURLに
https://oauth.pstmn.io/v1/browser-callback を設定する。
クライアント アプリケーションの登録の [API アクセス許可] で、組織が使用する API から Azure Healthcare APIS に対する User_Impersonation の委任アクセス許可を追加します
トークンの取得
Postman で、コレクションまたは特定の REST 呼び出しのいずれかの [認可] タブを選択し、OAuth 2.0 として [種類] を選択し、[新しいトークンの構成] セクションで、次の値を設定します。
- コールバック URL:
https://oauth.pstmn.io/v1/browser-callback
- 認証 URL:
https://login.microsoftonline.com/{{tenantid}}/oauth2/v2.0/authorize
- アクセス トークン URL:
https://login.microsoftonline.com/{{tenantid}}/oauth2/v2.0/token
- クライアント ID: アプリケーション クライアント登録 ID
- クライアント シークレット: アプリケーション クライアント登録シークレット
- スコープ:
{{fhirurl}}/.default
- クライアント認証: 本文でクライアント資格情報を送信する
Patitentの登録
- POST {{fhirurl}}/Patient
- ヘッダー:Bearerトークンを選択し、値に{{bearerToken}}を設定
- ボディ:
{
"resourceType": "Patient",
"active": true,
"name": [
{
"use": "official",
"family": "Kirk",
"given": [
"James",
"Tiberious"
]
},
{
"use": "usual",
"given": [
"Jim"
]
}
],
"gender": "male",
"birthDate": "1960-12-25"
}
- レスポンス:
{
"resourceType": "Patient",
"id": "1eae1e2c-1bd1-42f9-89eb-b171bc0efabd",
"meta": {
"versionId": "1",
"lastUpdated": "2024-04-25T16:08:26.999+00:00"
},
"active": true,
"name": [
{
"use": "official",
"family": "Kirk",
"given": [
"James",
"Tiberious"
]
},
{
"use": "usual",
"given": [
"Jim"
]
}
],
"gender": "male",
"birthDate": "1960-12-25"
}
Patientの取得
- GET {{fhirurl}}/Patient
- ヘッダー:Bearerトークンを選択し、値に{{bearerToken}}を設定
- レスポンス:
{
"resourceType": "Bundle",
"id": "ae39a05931d53bfc60a5932dbb81bf14",
"meta": {
"lastUpdated": "2024-04-25T16:17:16.0930365+00:00"
},
"type": "searchset",
"link": [
{
"relation": "self",
"url": "https://s3labws1-fhir1.fhir.azurehealthcareapis.com/Patient"
}
],
"entry": [
{
"fullUrl": "https://s3labws1-fhir1.fhir.azurehealthcareapis.com/Patient/1eae1e2c-1bd1-42f9-89eb-b171bc0efabd",
"resource": {
"resourceType": "Patient",
"id": "1eae1e2c-1bd1-42f9-89eb-b171bc0efabd",
"meta": {
"versionId": "1",
"lastUpdated": "2024-04-25T16:08:26.999+00:00"
},
"active": true,
"name": [
{
"use": "official",
"family": "Kirk",
"given": [
"James",
"Tiberious"
]
},
{
"use": "usual",
"given": [
"Jim"
]
}
],
"gender": "male",
"birthDate": "1960-12-25"
},
"search": {
"mode": "match"
}
}
]
}
エクスポート
FHIR サービスのシステム全体のマネージド ID を有効にする
システム割り当てマネージド ID は 1 つのリソースにつき 1 つに限定されており、このリソースのライフサイクルに関連付けられています。Azure のロールベースのアクセス制御 (Azure RBAC) を使用して、マネージド ID にアクセス許可を付与することができます。マネージド ID は Microsoft Entra ID で認証されるため、コード内に資格情報を格納する必要はありません。
FHIR サービス アクセスのアクセス許可をストレージ アカウントに付与
Azure Storage は、高可用性、セキュリティ、耐久性、スケーラビリティ、冗長性を備えたクラウド ストレージを提供する Microsoft が管理するサービスです。Azure Storage には、Azure BLOB (オブジェクト)、Azure Data Lake Storage Gen2、Azure Files、Azure Queues、Azure Tables が含まれます。ストレージ アカウントのコストは、使用量と、下で選ぶオプションに応じて決まります。
ADLS Gen2 アカウントを作成するには、[詳細設定] タブで階層型名前空間オプションを有効にしてください。
ストレージBLOBデータ共同作成者ロールを、マネージドIDでFHIRサービスにアサインする
FHIR サービス エクスポートのストレージ アカウントを指定
エクスポートの実行(postman)
- GET {{fhirurl}}/$export?_container=export
- Header
Accept: application/fhir+json
Prefer: respond-async
- Response
202ステータス