CLI と REST API を使用してクライアント アプリケーションを登録する

この記事では、Azure Health Data Services にアクセスするために、Azure コマンド ライン インターフェイス (CLI) と REST API を使って、Microsoft Entra ID でクライアント アプリケーションを登録する方法について説明します。 クライアント アプリケーションの登録は Azure portal を使ってできますが、スクリプトの方法を使うと、リソースを直接テストしてデプロイできます。 詳しくは、Azure portal でのクライアント アプリケーションの登録に関する記事をご覧ください。

ステップを 1 つずつ、または組み合わせて実行することで (いくつか省略できるステップが含まれます)、機密またはパブリックのクライアント アプリケーションを作成できます。 また、変数をスクリプトの途中に置くのではなく、事前に定義することもできます。 詳しくは、Azure Health Data Services のサンプルに関するページをご覧ください。

Note

スクリプトの作成とテストは、Visual Studio Code で行います。 ただし、環境内でそれらを検証し、必要な調整を行う必要があります。 たとえば、PowerShell 環境でスクリプトを実行できますが、変数に $ 記号を追加する必要があります。

Azure サブスクリプションにサインインします。

Azure にサインインする前に、環境にインストールされている az のバージョンを調べ、必要であれば最新バージョンにアップグレードします。 また、アカウントと Azure Health Data Services 拡張機能がインストールされていることを確認します。

az --version
az extension add --name account
az extension add --name healthcareapis
az provider register --namespace 'Microsoft.HealthcareApis'
az provider show --namespace Microsoft.HealthcareApis --query "resourceTypes[?resourceType=='services'].locations"

CLI の login コマンドを使って Azure にサインインし、既定で使われる Azure サブスクリプションとテナントの一覧を表示できます。 詳しくは、既定のサブスクリプションの変更に関する記事をご覧ください。 特定のテナントにサインインする方法について詳しくは、Azure のログインに関する記事をご覧ください。

az login
az account show --output table

クライアント アプリケーションを作成する

CLI コマンドを使って、機密クライアント アプリケーションの登録を作成できます。 実際のスクリプトでは、表示名 "myappregtest1" を変更する必要があります。

az ad app create --display-name myappregtest1

実際には、変数を定義し、それに値を割り当てて、クライアント アプリ ID とオブジェクト ID への参照を設定します。以降の手順では、この方法が使われています。

### Define app registration name, etc.
appregname=myappregtest1
clientid=$(az ad app create --display-name $appregname --query appId --output tsv)
objectid=$(az ad app show --id $clientid --query Id --output tsv)

echo $<variable name> を使って、指定した変数の値を表示できます。

echo $clientid

user_impersonation スコープを削除する

現在の形式の az ad app create コマンドでは、アプリケーションを API として公開するための user_impersonation スコープが追加されます。 Azure portal のアプリケーションの登録で [API の公開] ブレードを選ぶことで、この設定を表示できます。 ほとんどの場合、このスコープは必要ありません。 したがって、削除してもかまいません。

User_Impersonation

###Remove api permissions: disable default exposed scope first
default_scope=$(az ad app show --id $clientid | jq '.oauth2Permissions[0].isEnabled = false' | jq -r '.oauth2Permissions')
az ad app update --id $clientid --set oauth2Permissions="$default_scope"
az ad app update --id $clientid --set oauth2Permissions="[]"

az rest を使うと、user_impersonation スコープを作成せずに、Azure Graph ではなく Microsoft Graph を直接呼び出すことができます。 アプリケーション ID を取得するには、query パラメーターを使います。

az rest -m post -u https://graph.microsoft.com/v1.0/applications  --headers 'Content-Type=application/json' --body '{"displayName": "xxx"}'

### Use --query to obtain the client app id
clientid=$(az rest -m post -u https://graph.microsoft.com/v1.0/applications  --headers 'Content-Type=application/json' --body '{"displayName": "myappregtest1"}' --query appId --output tsv)

機密クライアント アプリケーションにクライアント シークレットを追加する

機密のクライアント アプリケーションの場合は、クライアント シークレットを追加する必要があります。 パブリック クライアント アプリケーションの場合は、この手順をスキップできます。

シークレットの名前を選び、有効期限を指定します。 既定では 1 年ですが、--end-date オプションを使って期間を指定できます。 クライアント シークレットは変数に保存され、echo コマンドを使って表示できます。 ポータルでは表示されないので、記録しておいてください。 デプロイ スクリプトでは、Azure Key Vault に値を保存して格納し、定期的にローテーションできます。

###Add client secret with expiration. The default is one year.
clientsecretname=mycert2
clientsecretduration=2
clientsecret=$(az ad app credential reset --id $clientid --append --display-name $clientsecretname --years $clientsecretduration --query password --output tsv)
echo $clientsecret

パブリック クライアント アプリケーションのフラグを変更する

パブリック クライアント アプリケーションの場合は、[パブリック クライアント フローを許可する] フラグを [はい] に変更します。 機密クライアント アプリケーションの場合は、このステップをスキップします。

Allow public client flows

###Optionally, change the app registration from confidential to public
az ad app update  --id $clientid  --set publicClient=true 

リダイレクト URL を追加する

リダイレクト URL の追加は省略可能なステップです。 --reply-urls を使って、Web アプリに 1 つ以上の応答 (またはリダイレクト) URL を追加できます。 ただし、パラメーターでアプリケーションまたはプラットフォームの種類を指定することはできません。

シングルページ アプリ、モバイル、デスクトップのアプリケーションの場合は、代わりに REST API を使って、アプリケーションまたはプラットフォームの種類を指定します。

###Update app registration using REST. az ad supports reply-urls only. 
#https://github.com/Azure/azure-cli/issues/9501
#redirecttype=spa | web | publicClient

redirecttype=publicClient
redirecturl=https://www.getpostman.com/oauth2/callback
graphurl=https://graph.microsoft.com/v1.0/applications/$objectid
az rest --method PATCH --uri $graphurl --headers 'Content-Type=application/json' --body '{"'$redirecttype'":{"redirectUris":["'$redirecturl'"]}}'

iOS/macOS と Android アプリケーションについて詳しくは、GitHub をご覧ください。

サービス プリンシパルの作成

アプリケーション登録プロセスを完了するには、クライアント アプリケーション用のサービス プリンシパルを作成する必要があります。 サービス プリンシパルは、アクセス許可 (またはロールの割り当て) をクライアント アプリケーションに付与するために使われます。

###Create an AAD service principal
spid=$(az ad sp create --id $clientid --query objectId --output tsv)
###Look up a service principal
spid=$(az ad sp show --id $clientid --query objectId --output tsv)

マニフェストを確認する

マニフェストの確認のステップは省略できます。 クライアント アプリケーションの詳細またはマニフェストを表示してダウンロードできます。

az ad app list --app-id $clientid

CLI と REST API を使ったアプリケーションの登録が完了したので、クライアント アプリケーションのサービス プリンシパルにアクセス許可を付与するか、ロールを割り当て、Web またはモバイル アプリケーションではクライアント アプリケーションの資格情報を使う必要があります。

次のステップ

この記事では、CLI と REST API を使って Microsoft Entra ID でクライアント アプリケーションを登録する方法について説明しました。 Azure Health Data Services に対するアクセス許可を付与する方法については、次をご覧ください