重要
この記事では、Microsoft 認証ライブラリ (MSAL) を使用して Microsoft Entra ID トークンを手動で作成する方法について説明します。
Databricks では、Azure Databricks ユーザー用の Microsoft Entra ID トークンを手動で作成することはお勧めしません。 これは、各 Microsoft Entra ID トークンは有効期間が短く、通常は 1 時間以内に期限切れになるためです。 この時間が経過したら、代わりの Microsoft Entra ID トークンを手動で生成する必要があります。 代わりに、 Databricks クライアント統合認証 標準を実装する参加ツールまたは SDK のいずれかを使用してください。 これらのツールと SDK は、Azure CLI 認証を利用して、期限切れの Microsoft Entra ID トークンを自動的に生成して置き換えます。
Azure Databricks マネージド サービス プリンシパルは、Azure Databricks 内で直接管理されます。 Microsoft Entra ID マネージド サービス プリンシパルは、追加のアクセス許可が必要とされる Microsoft Entra ID 内で管理されます。 Databricks では、ほとんどのユース ケースで Azure Databricks マネージド サービス プリンシパルを使用することをお勧めします。 ただし Databricks では、Azure Databricks と他の Azure リソースを同時に認証する必要がある場合には、Microsoft Entra ID マネージド サービス プリンシパルを使用することをお勧めします。
Microsoft Entra ID マネージド サービス プリンシパルの代わりに Azure Databricks マネージド サービス プリンシパルを作成するには、「 サービス プリンシパル」を参照してください。
Microsoft 認証ライブラリ (MSAL) を使用して、Microsoft Entra ID アクセス トークンをプログラムで取得できます。 この記事では、MSAL ライブラリの基本的な使用方法と、Python の例を使用した必要なユーザー入力について説明します。
注
MSAL は、Microsoft Entra ID Authentication Library (ADAL) を置き換えます。 セキュリティ修正プログラムを含め、ADAL についてのすべての Microsoft のサポートと開発は、2022 年 6 月 30 日に終了しました。 「 Microsoft Authentication Library (MSAL) へのアプリケーションの移行」を参照してください。
ヒント
MSAL よりも Azure CLI の方が手順が少なくて済むため、Azure CLI を使用してユーザーの Microsoft Entra ID トークンを取得することをお勧めします。 「Azure CLI を使用してユーザーの Microsoft Entra ID トークンを取得する」を参照してください。
Microsoft Entra ID でサービス プリンシパルを定義し、ユーザーではなくサービス プリンシパルの Microsoft Entra ID アクセス トークンを取得することもできます。 「サービス プリンシパルの Microsoft Entra ID トークンを取得する」を参照してください。
Azure portal でアプリを構成する
Azure portal で Microsoft Entra ID エンドポイントにアプリケーションを登録します。 または、既に登録済みの Microsoft Entra ID アプリを使用することもできます。 詳細については、「 Azure portal を使用してアプリを登録する」を参照してください。
Azure portal にサインインします。
注
使用するポータルは、Microsoft Entra ID アプリケーションが Azure パブリック クラウド、各国のクラウドまたはソブリン クラウドのいずれで実行されるかによって異なります。 詳細については、「 各国のクラウド」を参照してください。
複数のテナント、サブスクリプション、またはディレクトリにアクセスできる場合は、上部メニューの [ディレクトリ + サブスクリプション (フィルター付きディレクトリ)] アイコンをクリックして、アプリケーションを登録するディレクトリに切り替えます。
Microsoft Entra ID を検索して選択します。
[ 管理] で、[ アプリの登録] > [新しい登録] を選択します。
[名前] にアプリケーションの名前を入力します。
[サポートされているアカウントの種類] セクションで、[この組織ディレクトリのみに含まれるアカウント (シングル テナント)] を選択します。
[ リダイレクト URI (省略可能)] セクションの [ プラットフォームの選択] で、[ パブリック クライアント/ネイティブ (モバイルおよびデスクトップ)] を選択し、リダイレクト URI を入力します。 次の例では、リダイレクト URI の値は
http://localhost
です。[登録] をクリックします。
アプリケーション ページの [概要 ] ページの [ 要点 ] セクションで、次の値をコピーします。
- アプリケーション (クライアント) ID
- ディレクトリ (テナント) ID
- リダイレクト URI には、この手順で以前に入力した パブリック クライアント のリダイレクト URI を含めます。
登録済みアプリケーションの必要なアクセス許可に AzureDatabricks を追加します。 この手順を実行するには、管理者ユーザーである必要があります。 このアクションの実行中にアクセス許可に関連する問題が発生した場合は、管理者にお問い合わせください。
アプリケーション ページの [概要 ] ページの [ 作業の開始 ] タブで、[ API アクセス許可の表示] をクリックします。
[ アクセス許可の追加] をクリックします。
[ API のアクセス許可の要求 ] ウィンドウで、 組織で使用している API タブをクリックし、 AzureDatabricks を検索して選択します。
[user_impersonation] チェック ボックスをオンにし、[アクセス許可の追加] をクリックします。
[ ### の管理者の同意を付与 ] をクリックし、[ はい] をクリックします。 このアクションを実行するには、管理者ユーザーであるか、アプリケーションに同意を付与する特権を持っている必要があります。 ### に管理者の同意を付与するが表示されない場合、またはこのアクションをスキップする場合は、アプリケーションを初めて使用して同意を提供するときに承認コード フロー (対話型) を使用する必要があります。 その後、 ユーザー名とパスワードのフロー (プログラム) メソッドを使用できます。
アプリケーションにユーザーを追加できます。 詳細については、PowerShell の手順については、「Azure portal のエンタープライズ アプリケーションにユーザー アカウントを割り当てる」または「Microsoft Entra ID (旧称 Azure Active Directory)」のアプリケーションにユーザーとグループを割り当てる方法に関するページを参照してください。 ユーザーは、必要なアクセス許可なしにトークンを取得することはできません。
Microsoft Entra ID アクセス トークンを取得します
Microsoft Entra ID アクセス トークンを取得するには、次のいずれかを使用できます。
次の場合は、承認コード フロー (対話型) を使用して Microsoft Entra ID アクセス トークンを取得する必要があります。
- Microsoft Entra ID では、2 要素認証が有効になっています。
- Microsoft Entra ID では、フェデレーション認証が有効になっています。
- アプリケーションの登録中に、登録済みのアプリケーションに同意を付与することはできません。
ユーザー名とパスワードを使用してサインインする権限がある場合は、ユーザー名-パスワード フロー (プログラム) を使用して、Microsoft Entra ID アクセストークンを取得できます。
承認コード フロー (対話型)
承認コード フローを使用して Microsoft Entra ID アクセス トークンを取得するには、2 つの手順を実行します。
- ブラウザー ウィンドウを起動し、Azure ユーザー ログインを求める承認コードを要求します。 承認コードは、ユーザーが正常にログインした後に返されます。
- 承認コードを使用して、Microsoft Entra ID アクセス トークンを取得します。 使用する方法によっては、更新トークンも同時に返すことができ、Microsoft Entra ID アクセス トークンの更新に使用できます。
これら 2 つの手順を完了する方法の 1 つは、Web ブラウザーと curl を使用 することです。 これを行うには、Web ブラウザーを使用して承認コードを取得し、次に承認コードと curl
を使用して Microsoft Entra ID アクセストークンを取得します。 この方法では、更新トークンは提供されません。
別の方法では、MSAL Python ライブラリを使用します。 これを行うには、Web ブラウザーを使用して承認コードを取得し、次に承認コードを使用してアクセストークンと更新トークンの両方を取得する単一のスクリプトを実行します。
どちらの方法も、既に Azure にサインインしていることを前提としています。 サインインしていない場合は、サインインを求めるメッセージが表示されます。
Web ブラウザーと curl を使用して Microsoft Entra ID トークンを取得する
次の情報を収集してください。
パラメーター 説明 テナント ID Azure portal でのアプリの構成で Microsoft Entra ID に登録されている関連アプリケーションのディレクトリ (テナント) ID。 クライアントID Microsoft Entra ID に登録されている関連アプリケーションのアプリケーション (クライアント) ID。 リダイレクト URI Microsoft Entra ID に登録されている関連アプリケーションの適切な リダイレクト URI (たとえば、 http://localhost
)。 認証応答は、含まれている承認コードを使用してこの URI に送信されます。Web ブラウザーを使用して次の URL を参照し、承認コードを取得します。 次の URL の例のフィールドを適宜置き換えてください。 URL は単一行として送信する必要があります。読みやすくするために、次の URL に改行が追加されています。 詳細については、「 承認コードの要求」を参照してください。
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize?client_id=<client-id> &response_type=code &redirect_uri=<redirect-uri> &response_mode=query &scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default &state=<state>
次のように置換します。
-
<tenant-id>
登録されたアプリケーションのテナント ID を使用します。 -
<client-id>
登録されたアプリケーションのクライアント ID を使用します。 -
<redirect-uri>
登録されたアプリケーションのリダイレクト URI を使用します。 この URI は、URL エンコード (パーセントエンコード) 形式である必要があります。 たとえば、http://localhost
はhttp%3A%2F%2Flocalhost
です。 -
<state>
をランダムな数値またはエンコードされた情報で。 情報交換の整合性を確認するには、この状態値が、この手順で後から返される URL に含まれる値と一致している必要があります。
scope
パラメーターの値は変更しないでください。 これは、Azure Databricks (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
) のプログラム ID を、既定のスコープ (/.default
、%2f.default
として URL エンコード) と共に表します。例えば次が挙げられます。
https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/authorize?client_id=12a34b56-789c-0d12-e3fa-b456789c0123 &response_type=code &redirect_uri=http%3A%2F%2Flocalhost &response_mode=query &scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default &state=12345
-
URL を単一行として Web ブラウザーに貼り付け、メッセージが表示されたら Azure にサインインします。
承認コードは、返された URL の
code
フィールドにあります。 承認コードを安全な場所に保存します。state
フィールドの値が、この手順で前に指定したものと一致していることを確認します。完全に返された URL は次のようになります (簡潔にするために、ここでは、完全な
code
フィールド値を0.ASkAIj...RxgFhSAA
に短縮します)。http://localhost/?code=0.ASkAIj...RxgFhSAA&state=12345&session_state=c44574d5-38ba-4f93-b2a3-a830db8e8cdf
承認コードを
curl
と一緒に使用して、Microsoft Entra ID アクセストークンを取得します。curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token \ -d 'client_id=<client-id>' \ -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \ -d 'code=<authorization-code>' \ -d 'redirect_uri=<redirect-uri>' \ -d 'grant_type=authorization_code' \ -d 'state=<state>'
次のように置換します。
-
<tenant-id>
登録されたアプリケーションのテナント ID を使用します。 -
<client-id>
登録されたアプリケーションのクライアント ID を使用します。 -
<authorization-code>
をユーザーの承認コードで。 -
<redirect-uri>
登録されたアプリケーションのリダイレクト URI を使用します。 この URI は、URL エンコード (パーセントエンコード) 形式である必要があります。 たとえば、http://localhost
はhttp%3A%2F%2Flocalhost
です。 -
<state>
をランダムな数値またはエンコードされた情報で。 情報交換の整合性を確認するには、この状態値が、この手順の後からの応答ペイロードに含まれる値と一致している必要があります。
scope
パラメーターの値は変更しないでください。 これは、Azure Databricks (2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
) のプログラム ID を、既定のスコープ (/.default
、%2f.default
として URL エンコード) と共に表します。例えば次が挙げられます。
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/a1bc2d34-5e67-8f89-01ab-c2345d6c78de/oauth2/v2.0/token \ -d 'client_id=12a34b56-789c-0d12-e3fa-b456789c0123' \ -d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \ -d 'code=0.ASkAIj...RxgFhSAA' \ -d 'redirect_uri=http%3A%2F%2Flocalhost' \ -d 'grant_type=authorization_code' \ -d 'state=12345'
Microsoft Entra ID トークンは、呼び出しの結果内の
access_token
値の中にあります。state
値が、この手順で前に指定した値と一致していることを確認してください。-
MSAL Python ライブラリを使用して Microsoft Entra ID トークンを取得する
次の情報を収集してください。
パラメーター 説明 テナント ID Azure portal でのアプリの構成で Microsoft Entra ID に登録されている関連アプリケーションのディレクトリ (テナント) ID。 クライアントID Microsoft Entra ID に登録されている関連アプリケーションのアプリケーション (クライアント) ID。 この手順では、Microsoft Entra ID に登録されている関連アプリケーションの
http://localhost
としてを設定していることを前提としています。pip install msal
を実行して、ローカル コンピューターに MSAL Python SDK をインストールします。次のコードを
get-tokens.py
としてローカル コンピューターに保存します。# Given the client ID and tenant ID for an app registered in Azure, # provide a <ms-entra-id> access token and a refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID and tenant ID here, # or you can provide them as command-line arguments to this script. client_id = '<client-id>' tenant_id = '<tenant-id>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '/.default'. scopes = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 3): print("Usage: get-tokens.py <client ID> <tenant ID>") exit(1) # If the registered app's client ID and tenant ID are provided as # command-line variables, set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_interactive( scopes = scopes ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("Access token:\n") print(acquire_tokens_result['access_token']) print("\nRefresh token:\n") print(acquire_tokens_result['refresh_token'])
次のいずれかを行ってください:
- 前のコードでは、
<client-id>
を登録済みアプリケーションのクライアント ID に置き換え、<tenant-id>
を登録済みアプリケーションのテナント ID に置き換えてから、スクリプト (python get-tokens.py
など) を実行します。 - スクリプトの実行時に、登録されたアプリケーションのクライアント ID と登録済みアプリケーションのテナント ID (
python get-tokens.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de
など) を指定します。
- 前のコードでは、
Web ブラウザーでプロンプトが表示されたら、Azure にサインインします。
Microsoft Entra ID のアクセス トークンと更新トークンが出力に出力されます。
ユーザー名/パスワード フロー (プログラム)
ユーザー名とパスワードを使用してサインインする権限がある場合は、次の情報を収集します。
パラメーター 説明 テナント ID Azure portal でのアプリの構成で Microsoft Entra ID に登録されている関連アプリケーションのディレクトリ (テナント) ID。 クライアントID Microsoft Entra ID に登録された関連するアプリケーションのアプリケーション (クライアント) ID。 ユーザー名とパスワード テナント内のユーザーのユーザー名 (つまり、Azure portal にログインしたときの電子メールアドレス) とパスワード。 この手順では、Microsoft Entra ID に登録されている関連アプリケーションの
http://localhost
としてを設定していることを前提としています。pip install msal
を実行して、ローカル コンピューターに MSAL Python SDK をインストールします。次のコードを
get-tokens-for-user.py
としてローカル コンピューターに保存します。# Given the client ID and tenant ID for an app registered in Azure, # along with an Azure username and password, # provide a <ms-entra-id> access token and a refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID and tenant ID here, # along with the Azure username and password, # or you can provide them as command-line arguments to this script. client_id = '<client-id>' tenant_id = '<tenant-id>' username = '<username>' password = '<password>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '/.default'. scope = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 5): print("Usage: get-tokens-for-user.py <client ID> <tenant ID> <username> <password>") exit(1) # If the registered app's client ID and tenant ID along with the # Azure username and password are provided as command-line variables, # set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] username = sys.argv[3] password = sys.argv[4] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_by_username_password( username = username, password = password, scopes = scope ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("Access token:\n") print(acquire_tokens_result['access_token']) print("\nRefresh token:\n") print(acquire_tokens_result['refresh_token'])
次のいずれかを行ってください:
- 前のコードでは、
<client-id>
を登録済みアプリケーションのクライアント ID に置き換え、<tenant-id>
登録済みのアプリケーションのテナント ID、<username>
ユーザー名、<password>
をパスワードに置き換えてから、スクリプト (python get-tokens-for-user.py
など) を実行します。 - スクリプトの実行時に、登録されたアプリケーションのクライアント ID、登録済みアプリケーションのテナント ID、ユーザー名、パスワードを指定します (例:
python get-tokens-for-user.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de someone@example.com "MyPa55w&rd!"
)。 コマンドライン引数に特殊文字が含まれている場合は、引用符で囲む必要があります。
- 前のコードでは、
新しい Microsoft Entra ID のアクセス トークンと更新トークンがターミナルに出力されます。
Microsoft Entra ID アクセス トークンを使用して、Databricks REST API にアクセスする
このセクションでは、Microsoft Entra ID アクセス トークンを使用して、Databricks REST API を呼び出す方法について説明します。 次の例では、 <access-token>
を Microsoft Entra ID アクセス トークンに置き換え、 <databricks-instance>
を Azure Databricks デプロイの ワークスペースごとの URL に置き換えます。
Python の例
この例では、Azure Databricks ワークスペースでクラスターを一覧表示する方法を示します。
import requests
import json
databricks_instance = '<databricks-instance>'
api_version = '/api/2.0'
api_command = '/clusters/list'
url = f"https://{databricks_instance}{api_version}{api_command}"
access_token = '<access-token>'
response = requests.get(
url = url,
headers = { 'Authorization': "Bearer " + access_token}
)
print(json.dumps(json.loads(response.text), indent = 2))
注
管理者以外のユーザーで、管理者ユーザーとしてログインする場合は、X-Databricks-Azure-Workspace-Resource-Id
ヘッダーに加えて 'Authorization' : 'Bearer '
ヘッダーを指定する必要があります。また、Azure のワークスペース リソースの共同作成者または所有者ロールである必要があります。
X-Databricks-Azure-Workspace-Resource-Id
値は次のように構成します。
# ...
subscription = '<azure-subscription-id>'
resource_group = '<azure-resource-group-name>'
workspace = '<databricks-workspace-name-in-azure>'
db_resource_id = '/subscriptions/%s/resourcegroups/%s/providers/microsoft.databricks/workspaces/%s' % (
subscription,
resource_group,
workspace
)
# ...
headers = {
'Authorization': "Bearer " + access_token,
'X-Databricks-Azure-Workspace-Resource-Id': db_resource_id
}
# ...
Azure でサブスクリプション、リソース、ワークスペースの情報を取得するには、「 リソースを開く」を参照してください。 ターゲット リソースを開くには、Azure Databricks サービスの種類と、ターゲット の Azure Databricks ワークスペースについて知っている Azure 内のその他の情報を検索できます。
curl
の例
curl -X GET \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list
Microsoft Entra ID アクセス トークンを更新する
Microsoft Entra ID アクセストークンと共に更新トークンを取得した場合は、更新トークンを使用して新しいトークンを取得できます。 既定では Microsoft Entra ID アクセス トークンの有効期間は、60 ~ 90 分 (平均で 75 分) のランダムな期間です。 Microsoft Entra ID (旧称 Azure Active Directory) の構成可能なトークン有効期間のメソッドを使用して、Microsoft Entra ID アクセス トークンの有効期間を構成できます。
次の例は、MSAL Python ライブラリと更新トークンを使用して新しいトークンを取得する方法を示しています。
次のコードを
refresh-tokens.py
としてローカル コンピューターに保存します。# Given the client ID and tenant ID for an app registered in Azure, # along with a refresh token, provide a new <ms-entra-id> access token and # refresh token. # If the caller is not already signed in to Azure, the caller's # web browser will prompt the caller to sign in first. # pip install msal from msal import PublicClientApplication import sys # You can hard-code the registered app's client ID, tenant ID, # and refresh token here, or you can provide them as command-line # arguments to this script. client_id = '<client-id>' tenant_id = '<refresh-token' refresh_token = '<refresh-token>' # Do not modify this variable. It represents the programmatic ID for # Azure Databricks along with the default scope of '.default'. scope = [ '2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default' ] # Check for too few or too many command-line arguments. if (len(sys.argv) > 1) and (len(sys.argv) != 4): print("Usage: refresh-tokens.py <client ID> <tenant ID> <refresh token>") exit(1) # If the registered app's client ID, tenant ID, and refresh token are # provided as command-line variables, set them here. if len(sys.argv) > 1: client_id = sys.argv[1] tenant_id = sys.argv[2] refresh_token = sys.argv[3] app = PublicClientApplication( client_id = client_id, authority = "https://login.microsoftonline.com/" + tenant_id ) acquire_tokens_result = app.acquire_token_by_refresh_token( refresh_token = refresh_token, scopes = scope ) if 'error' in acquire_tokens_result: print("Error: " + acquire_tokens_result['error']) print("Description: " + acquire_tokens_result['error_description']) else: print("\nNew access token:\n") print(acquire_tokens_result['access_token']) print("\nNew refresh token:\n") print(acquire_tokens_result['refresh_token'])
次のいずれかを行ってください:
- 前のコードでは、
<client-id>
を登録済みアプリケーションのクライアント ID に置き換え、登録済みのアプリケーションのテナント ID で<tenant-id>
し、更新トークンで<refresh-token>
してから、スクリプト (python get-tokens-for-user.py
など) を実行します。 - 登録されたアプリケーションのクライアント ID、登録済みアプリケーションのテナント ID、スクリプトの実行時の更新トークン (
python refresh-tokens.py 12a34b56-789c-0d12-e3fa-b456789c0123 a1bc2d34-5e67-8f89-01ab-c2345d6c78de "0.ASkAIj...huE84ALg"
など) を指定します。 コマンドライン引数に特殊文字が含まれている場合は、引用符で囲む必要があります。
- 前のコードでは、
新しい Microsoft Entra ID のアクセス トークンと更新トークンがターミナルに出力されます。