Azure Active Directory B2C を使用して FHIR サービスへのアクセスを許可する
医療機関は、Azure Health Data Services の FHIR® サービスと一緒に Azure Active Directory B2C (Azure AD B2C) を使用して、アプリケーションとユーザーへのアクセスを許可できます。
FHIR サービス用の Azure AD B2C テナントを作成する
FHIR サービス用の Azure AD B2C テナントを作成すると、医療アプリケーションでユーザー ID を管理するための安全なインフラストラクチャが設定されます。
Azure AD B2C テナントを既に作成している場合は、Azure AD B2C を使用して FHIR サービスをデプロイするに関するページに進むことができます。
ARM テンプレートを使用して Azure AD B2C テナントをデプロイする
PowerShell または Azure CLI を使用して、プログラムによって ARM テンプレートを Azure サブスクリプションにデプロイします。 テンプレートの構文、プロパティ、使用方法の詳細については、Azure Active Directory B2C のインスタンスをデプロイするに関するページを参照してください。
Azure Cloud Shell または Visual Studio Code の PowerShell でローカル側からコードを実行して、FHIR サービスを Azure AD B2C テナントにデプロイします。
Connect-AzAccount
を使用して Azure にサインインします。 サインインしたら、Get-AzContext
を使用して、使用するサブスクリプションとテナントを確認します。 必要に応じて、サブスクリプションとテナントを変更します。新しいリソース グループを作成します (または、「リソース グループの作成」手順をスキップするか、
New-AzResourceGroup
で始まる行をコメント アウトして、既存のものを使用します)。
### variables
$tenantid="your tenant id"
$subscriptionid="your subscription id"
$resourcegroupname="your resource group name"
$b2cName="your b2c tenant name"
### login to azure
Connect-AzAccount -Tenant $tenantid -SubscriptionId $subscriptionid
### create resource group
New-AzResourceGroup -Name $resourcegroupname -Location $region
### deploy the resource
New-AzResourceGroupDeployment -ResourceGroupName $resourcegroupname -TemplateUri https://raw.githubusercontent.com/Azure-Samples/azure-health-data-and-ai-samples/main/samples/fhir-aad-b2c/b2c-arm-template.json -b2cName $b2cNa
テスト B2C ユーザーを Azure AD B2C テナントに追加する
FHIR サービスの特定の患者リソースに関連付け、認証フローが期待どおりに動作することを確認するためのテスト B2C ユーザーが必要です。
B2C ユーザーを fhirUser
カスタム ユーザー属性にリンクする
fhirUser
カスタム ユーザー属性は、B2C ユーザーを FHIR サービスのユーザー リソースにリンクするために使用されます。 この例では、Test Patient1 というユーザーが B2C テナントに作成されます。 後の手順で、FHIR サービスに patient リソースが作成されます。 fhirUser
属性値を患者リソース識別子に設定することで、Test Patient1 ユーザーは患者リソースにリンクされます。 カスタム ユーザー属性の詳細については、Azure Active Directory B2C のユーザー フロー カスタム属性に関するページを参照してください。
左側のウィンドウの [Azure AD B2C] ページで、[ユーザー属性] を選択します。
[+ 追加] を選択します。
[名前] フィールドに、「fhirUser」と入力します (大文字と小文字が区別されます)。
[データ型] ドロップダウン リストで [文字列] を選択します。
[作成] を選択します。
新しい B2C ユーザー フローを作成する
ユーザー フローでは、ユーザーがサインインするために従う必要がある一連の手順を定義します。 この例では、ユーザーがサインインすると、指定されたアクセス トークンに fhirUser
要求が含まれるように、ユーザー フローが定義されています。 詳細については、「Azure Active Directory B2C でユーザー フローとカスタム ポリシーを作成する」をご覧ください。
左側のウィンドウの [Azure AD B2C] ページで、[ユーザー フロー] を選択します。
[+ 新しいユーザー フロー] を選択します。
ユーザー フローに B2C テナントに固有の名前を付けます。 この名前は、グローバルに一意である必要はありません。 この例では、ユーザー フローの名前は USER_FLOW_1 です。 この名前をメモしておきます。
テスト ユーザーがサインインして FHIR サービスのアクセス トークンを取得できるように、ローカル アカウントに対して [メールでのサインイン] が有効になっていることを確認します。
[ユーザー フローの作成] ページで、セクション [5. アプリケーション要求] までスクロールし、[さらに表示...] を選択して使用可能なすべての要求の一覧を表示します。
fhirUser 要求を選択します。
[OK] を選択します。
[作成] を選択します。
新しい B2C リソース アプリケーションを作成する
B2C リソース アプリケーションでは、医療アプリケーションから Azure Active Directory B2C への認証要求を処理します。
左側のウィンドウの [Azure AD B2C] ページで、[アプリの登録] を選択します。
[+ 新規登録] を選択します。
表示名を入力します。 この例では、FHIR サービスを使用します。
[サポートされているアカウントの種類] の一覧で、[任意の ID プロバイダーまたは組織ディレクトリ内のアカウント (ユーザー フローを使用したユーザーの認証用)] を選択します。
[リダイレクト URI (推奨)] ドロップダウン リストで、*[パブリック クライアント/ネイティブ (モバイルとデスクトップ)] を選択します。 値に Postman コールバック URI https://oauth.pstmn.io/v1/callback を取り込みます。 このコールバック URI はテスト用です。
[アクセス許可] セクションで、[openid と offline_access アクセス許可に対して管理者の同意を付与します] をオンにします。
[登録] を選択します。 アプリケーションの登録が完了するまで待ちます。 ブラウザーは、アプリケーションの [概要] ページに自動的に移動します。
アプリ用に API アクセス許可を構成する
左側のウィンドウの [アプリの登録] ページで、[マニフェスト] を選択します。
oauth2Permissions
配列が見つかるまでスクロールします。 この配列を、oauth2Permissions.json ファイル内の 1 つ以上の値に置き換えます。 配列全体または個々のアクセス許可をコピーします。アクセス許可を一覧に追加すると、B2C テナント内の任意のユーザーが API アクセス許可を持つアクセス トークンを取得できます。 アクセス レベルが B2C テナント内のユーザーに適していない場合は、アクセス許可をユーザーのサブセットに制限する方法がないため、配列に追加しないでください。
oauth2Permissions 配列が設定されたら、[保存] を選択します。
Web API を公開し、アプリケーション ID URI を割り当てる
左側のウィンドウの [アプリの登録] ページで、[API の公開] を選択します。
追加を選択します。
既定では、[アプリケーション ID URI] フィールドには、アプリケーション (クライアント) ID が取り込まれます。 必要に応じて値を変更します。 この例では、値は fhir です。
保存を選択します。
左側のウィンドウの [アプリの登録] ページで、[API のアクセス許可] を選択します。
[+ アクセス許可の追加] を選択します。
[API アクセス許可の要求] ウィンドウで、[所属する組織で使用している API] を選択します。
一覧からリソース アプリケーションを選択します。
[患者] セクションの [API アクセス許可の要求] ウィンドウで、少なくとも 1 つのアクセス許可を選択します。 この例では、アクセス許可
patient.all.read
が選択されています。つまり、スコープpatient.all.read
を持つアクセス トークンを要求するユーザーには、患者のコンパートメント (patient.all.read) 内のすべての FHIR リソース (patient.all.read) に対する読み取り特権 (patient.all.read) があります。詳細については、患者のコンパートメントに関するページを参照してください。[アクセス許可の追加] を選択します。
[構成されたアクセス許可] セクションの [API のアクセス許可] ページで、[管理者の同意を与える] を選択します。
ID プロバイダーとして Azure Active Directory B2C を使用する FHIR サービスをデプロイする
ID プロバイダーとして Azure Active Directory B2C を使用する FHIR サービスをデプロイすると、FHIR サービスでは Azure AD B2C 資格情報に基づいてユーザーを認証でき、許可されているユーザーのみが患者の機密情報にアクセスできるようになります
B2C 機関とクライアント ID を取得する
authority と client ID (またはアプリケーション ID) パラメータを使用して、Azure AD B2C テナントを ID プロバイダーとして使用するように FHIR サービスを構成します。
B2C テナントの名前とユーザー フローの名前を使用して、機関文字列を作成します。
https://<YOUR_B2C_TENANT_NAME>.b2clogin.com/<YOUR_B2C_TENANT_NAME>.onmicrosoft.com/<YOUR_USER_FLOW_NAME>/v2.0
.well-known/openid-configuration
エンドポイントに対して要求を行って、機関文字列をテストします。 ブラウザーに文字列を入力して、OpenId 構成 JSON ファイルに移動することを確認します。 OpenId 構成 JSON の読み込みに失敗した場合は、B2C テナント名とユーザー フロー名が正しいことを確認してください。https://<YOUR_B2C_TENANT_NAME>.b2clogin.com/<YOUR_B2C_TENANT_NAME>.onmicrosoft.com/<YOUR_USER_FLOW_NAME>/v2.0/.well-known/openid-configuration
リソース アプリケーションの概要ページからクライアント ID を取得します。
ARM テンプレートを使用して FHIR サービスをデプロイする
FHIR サービスのデプロイを簡略化するには、ARM テンプレートを使用します。 PowerShell または Azure CLI を使用して、ARM テンプレートを Azure サブスクリプションにデプロイします。
Azure Cloud Shell または Visual Studio Code の PowerShell でローカル側からコードを実行して、FHIR サービスを Azure AD B2C テナントにデプロイします。
Connect-AzAccount
を使用して Azure にサインインします。Get-AzContext
を使用して、使用するサブスクリプションとテナントを確認します。 必要に応じて、サブスクリプションとテナントを変更します。新しいリソース グループを作成します (または、「リソース グループの作成」手順をスキップするか、
New-AzResourceGroup
で始まる行をコメント アウトして、既存のものを使用します)。
### variables
$tenantid="your tenant id"
$subscriptionid="your subscription id"
$resourcegroupname="your resource group name"
$region="your desired region"
$workspacename="your workspace name"
$fhirServiceName="your fhir service name"
$smartAuthorityUrl="your authority (from previous step)"
$smartClientId="your client id (from previous step)"
### login to azure
Connect-AzAccount
#Connect-AzAccount SubscriptionId $subscriptionid
Set-AzContext -Subscription $subscriptionid
Connect-AzAccount -Tenant $tenantid -SubscriptionId $subscriptionid
#Get-AzContext
### create resource group
New-AzResourceGroup -Name $resourcegroupname -Location $region
### deploy the resource
New-AzResourceGroupDeployment -ResourceGroupName $resourcegroupname -TemplateUri https://raw.githubusercontent.com/Azure-Samples/azure-health-data-and-ai-samples/main/samples/fhir-aad-b2c/fhir-service-arm-template.json -tenantid $tenantid -region $region -workspaceName $workspacename -fhirServiceName $fhirservicename -smartAuthorityUrl $smartAuthorityUrl -smartClientId $smartClientId
Azure AD B2C ユーザーが FHIR リソースにアクセスできることを検証する
この検証プロセスでは、FHIR サービスで患者リソースを作成し、患者リソースを Azure AD B2C ユーザーにリンクし、B2C ユーザーのアクセス トークンを取得するように Postman を構成します。 検証プロセスが完了したら、B2C テスト ユーザーを使用して患者リソースを取り込むことができます。
Postman を実行してアクセス トークンを取得する
Postman アプリケーションをローカル側または Web ブラウザーで実行します。 FHIR サービスへの適切なアクセス権を取得する手順については、Postman を使用して FHIR サービスにアクセスするに関するページを参照してください。
「FHIR リソースを取得する」セクションの手順を実行すると、要求は空の応答を返します。これは、FHIR サービスは新規であり、患者リソースがないためです。
FHIR サービスに患者リソースを作成する
B2C テナント内のユーザーは、そのユーザー (患者や開業医など) が FHIR リソースにリンクされるまで、リソースを読み取ることができないことに注意することが重要です。 FHIR サービスがテナントされている Microsoft Entra ID の FhirDataWriter
または FhirDataContributor
ロールを持つユーザーは、この手順を実行する必要があります。
- メソッドを
PUT
に変更し、次の本文で{{fhirurl}}/Patient/1
に対する要求を実行して、特定の識別子を持つ患者を作成します。
{
"resourceType": "Patient",
"id": "1",
"name": [
{
"family": "Patient1",
"given": [
"Test"
]
}
]
}
- メソッドを
GET
に戻し、{{fhirurl}}/Patient
に対する要求によって新しく作成された患者が返されることを確認することで、患者が作成されたことを確認します。
患者リソースを Azure AD B2C ユーザーにリンクする
B2C テナントのテスト ユーザーと FHIR サービスのリソースとの間に明示的なリンクを作成します。 Microsoft Graph で拡張属性を使用してリンクを作成します。 詳細については、「Azure Active Directory B2C でカスタム属性を定義する」を参照してください。
B2C テナントに移動します。 左側のウィンドウで [アプリの登録] を選択します。
[すべてのアプリケーション] を選択します。
b2c-extensions-app プレフィックスを持つアプリケーションを選択します。
[アプリケーション (クライアント) ID] の値をメモしておきます。
B2C テナントのホーム ページに戻り、左側のウィンドウで [ユーザー] を選択します。
[Test Patient1] を選択します。
[オブジェクト ID] 値を書き留めます。
Microsoft Graph Explorer を開きます。 B2C テナントの全体管理者ロールに割り当てられているユーザーでサインインします。 (テナント内のユーザーを管理するには、B2C テナントに新しい管理者ユーザーを作成することをお勧めします。)
ユーザーのアバターを選択し、[アクセス許可に同意する] を選択します。
[ユーザー] までスクロールします。 User.ReadWrite.All に同意します。 このアクセス許可を使用すると、Test Patient1 ユーザーを
fhirUser
要求値で更新できます。同意プロセスが完了したら、ユーザーを更新します。 b2c-extensions-app アプリケーション (クライアント) ID とユーザー オブジェクト ID が必要です。
メソッドを
PATCH
に変更します。URL を https://graph.microsoft.com/v1.0/users/{USER_OBJECT_ID} に変更します。
PATCH
本文を作成します。PATCH
本文はキーと値の単一のペアであり、キー形式はextension_{B2C_EXTENSION_APP_ID_NO_HYPHENS}_fhirUser
、値は患者の完全修飾 FHIR リソース IDhttps://{YOUR_FHIR_SERVICE}.azurehealthcareapis.com/Patient/1"
です。
詳細については、「Microsoft Graph を使用して拡張機能属性を管理する」を参照してください。
要求を書式設定したら、[クエリの実行] を選択します。 B2C テナントのユーザーが FHIR サービスの患者リソースにリンクされていることを確認する成功応答が表示されるまで待ちます。
B2C ユーザーのアクセス トークンを取得するように Postman を構成する
認証フローをテストするためにアクセス トークンを取得します。
Postman アプリケーションを起動し、新しい [空のコレクション] を作成します。 この例では、コレクションに「FHIR Patient」という名前を付けます。
コレクションの概要で [認可] タブを選択します。
[種類] ドロップダウン リストで [OAuth 2.0] を選びます。
[新しいトークンの構成] セクションまでスクロールし、次の値を入力します。
[コールバック URL]。 この値は、B2C リソース アプリケーションの作成時に構成されます。
https://oauth.pstmn.io/v1/callback
[認証 URL]。 この値は、B2C テナントの名前とユーザー フローの名前を使用して作成できます。
https://{YOUR_B2C_TENANT_NAME}.b2clogin.com/{YOUR_B2C_TENANT_NAME}.onmicrosoft.com/{YOUR_USER_FLOW_NAME}/oauth2/v2.0/authorize
[アクセス トークン URL]。 この値は、B2C テナントの名前とユーザー フローの名前を使用して作成できます。
https://{YOUR_B2C_TENANT_NAME}.b2clogin.com/{YOUR_B2C_TENANT_NAME}.onmicrosoft.com/{YOUR_USER_FLOW_NAME}/oauth2/v2.0/token
クライアント ID。 この値は、B2C リソース アプリケーションのアプリケーション (クライアント) ID です。
{YOUR_APPLICATION_ID}
スコープ: この値は、B2C リソース アプリケーションの [API の公開] セクションで定義されます。 スコープが付与されたアクセス許可は
patient.all.read
です。 スコープ要求は、完全修飾 URL である必要があります (例:https://testb2c.onmicrosoft.com/fhir/patient.all.read
)。
B2C リソース アプリケーションの [API の公開] セクションから完全修飾スコープをコピーします。
{YOUR_APPLICATION_ID_URI}/patient.all.read
B2C ユーザーを使用して患者リソースを取り込む
Azure AD B2C ユーザーが FHIR リソースにアクセスできることを確認します。
B2C ユーザー フローを起動するように Postman の認可構成が設定されている場合、[新しいアクセス トークンの取得] を選択してアクセス トークンを取得します。
テスト患者の資格情報を使用してサインインします。
[トークンの使用] を選択して、コレクション内のすべての要求に対してアクセス トークンを使用します。
FHIR サービスで患者リソースを検索する新しい要求を作成します。 コレクションの名前の横にある省略記号ボタン (...) を選択し、[要求の追加] を選択します。
メソッドを
GET
に設定し、完全修飾 FHIR サービス URL を入力して、パス/Patient
を追加します。[送信] を選択します。
応答に単一の患者リソースが含まれていることを確認します。
次のステップ
Note
FHIR® は HL7 の登録商標であり、HL7 の許可を得て使用しています。