MicrosoftのAzure Health Data Servicesの使用(2)

Microsoft

アプリケーションの登録

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 として [種類] を選択し、[新しいトークンの構成] セクションで、次の値を設定します。

  • コールバック URLhttps://oauth.pstmn.io/v1/browser-callback
  • 認証 URLhttps://login.microsoftonline.com/{{tenantid}}/oauth2/v2.0/authorize
  • アクセス トークン URLhttps://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ステータス

ストレージの確認

関連記事

カテゴリー

アーカイブ