このページでは、ユーザーとサービス プリンシパルが Azure Databricks REST API で認証するための Microsoft Entra ID アクセス トークンを手動で生成する方法について説明します。 手動によるトークン生成は高度な手法です。
Important
Databricks では、Microsoft Entra ID トークンを手動で作成することはお勧めしません。 1 時間以内に有効期限が切れ、手動で交換する必要があります。 代わりに、 統合認証 でツールまたは SDK を使用して、トークン管理を自動的に処理します。
ほとんどのユース ケースでは 、Azure Databricks マネージド サービス プリンシパル を使用します。 追加の Microsoft Entra ID アクセス許可が必要であるため、Azure リソースにアクセスする必要がある場合にのみ、Microsoft Entra ID マネージド サービス プリンシパルを使用します。
手動によるトークン生成を使用するタイミング
手動トークン生成は、次の場合にのみ使用します。
- Azure CLI または統合認証を使用できないシステムと統合する必要がある
- トークンのライフサイクルと更新を明示的に制御する必要がある
- 認証の問題をデバッグしている
その他のすべてのユース ケースでは、トークン管理を自動的に処理する推奨認証方法を使用します。
ユーザーのトークンを取得する
Azure CLI または Microsoft Authentication Library (MSAL) を使用して、ユーザーの Microsoft Entra ID アクセス トークンを取得します。
Azure CLI の方法
ユーザー アカウントの Azure サブスクリプション ID を取得します。
Azure Databricks ワークスペースから: ユーザー名 >Azure Portal>Overview をクリックし、 サブスクリプション ID を見つけます。
Azure CLI を使用する場合: 次のコマンドを実行します (ワークスペースの URL に置き換えます)。
az databricks workspace list --query "[?workspaceUrl==\`adb-0000000000000000.0.azuredatabricks.net\`].{id:id}" -o tsv # /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-rg/providers/Microsoft.Databricks/workspaces/my-ws00000000-0000-0000-0000-000000000000後の/subscriptions/は、サブスクリプション ID です。テナント エラーが発生した場合は、正しいテナントにサインインします。
az login -t <tenant-id>
Azure にサインインします。
az login正しいサブスクリプションを設定します。
az account set -s <subscription-id>アクセス トークンを生成します。
az account get-access-token \ --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \ --query "accessToken" \ -o tsv2ff814a6-3304-4ab8-85cb-cd0e6f879c1dリソース ID は、すべての Azure 環境における Azure Databricks の標準識別子です。
MSAL メソッド
Microsoft 認証ライブラリ (MSAL) を使用して、プログラムによって Microsoft Entra ID アクセス トークンを取得します。 MSAL では、次の 2 つのフローがサポートされています。
- 承認コード フロー (対話型): ユーザー サインイン用のブラウザーを起動します。 これは、2 要素認証またはフェデレーション認証が有効になっている場合、または管理者の同意が必要な場合に使用します。
- ユーザー名とパスワードのフロー (プログラム): ユーザー名とパスワードを使用して認証します。 これは、プログラムでサインインする権限がある場合にのみ使用します。
MSAL を使用する前に、Microsoft Entra ID でアプリケーションを登録する必要があります。 Azure portal を使用したアプリの登録に関するページを参照してください。 登録時:
- [サポートされているアカウントの種類] を[この組織のディレクトリ内のアカウントのみ (シングル テナント)]に設定します。
-
リダイレクト URI を パブリック クライアント/ネイティブ (モバイルおよびデスクトップ) に
http://localhost設定します。 - アプリの [概要] ページから、アプリケーション (クライアント) ID とディレクトリ (テナント) ID をメモします。
-
AzureDatabricks API アクセス許可を追加します。
- API のアクセス許可に移動します>アクセス許可を追加します。
- AzureDatabricks を検索して選択します。
- user_impersonationを有効にし、[アクセス許可の追加] をクリックします。
- [ 管理者の同意を付与する (管理者特権が必要)] をクリックします。
承認コード フロー
MSAL Python SDK をインストールします。
pip install msal
次のコードを get-tokens.pyとして保存します。
from msal import PublicClientApplication
import sys
# Provide client ID and tenant ID as command-line arguments
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']
app = PublicClientApplication(
client_id=client_id,
authority=f"https://login.microsoftonline.com/{tenant_id}"
)
result = app.acquire_token_interactive(scopes=scopes)
if 'error' in result:
print(f"Error: {result['error']}")
print(f"Description: {result['error_description']}")
else:
print(f"Access token:\n{result['access_token']}")
print(f"\nRefresh token:\n{result['refresh_token']}")
スクリプトを実行します。
python get-tokens.py <client-id> <tenant-id>
ユーザー名とパスワードのフロー
次のコードを get-tokens-user.pyとして保存します。
from msal import PublicClientApplication
import sys
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
username = sys.argv[3] if len(sys.argv) > 1 else '<username>'
password = sys.argv[4] if len(sys.argv) > 1 else '<password>'
scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']
app = PublicClientApplication(
client_id=client_id,
authority=f"https://login.microsoftonline.com/{tenant_id}"
)
result = app.acquire_token_by_username_password(
username=username,
password=password,
scopes=scopes
)
if 'error' in result:
print(f"Error: {result['error']}")
print(f"Description: {result['error_description']}")
else:
print(f"Access token:\n{result['access_token']}")
print(f"\nRefresh token:\n{result['refresh_token']}")
スクリプトを実行します。
python get-tokens-user.py <client-id> <tenant-id> <username> <password>
サービス プリンシパルのトークンを取得する
サービス プリンシパルは OAuth 2.0 クライアント資格情報フローを 使用し、通常のユーザーとは異なるアクセス制御を持つことができます。
サービス プリンシパルを作成する
サービス プリンシパルがない場合は、Azure portal または Azure CLI を使用して作成します。
Azure portal
- Azure portal にサインインします。
- 必要に応じて、 ディレクトリとサブスクリプション を使用して適切なテナントに切り替えます。
- Microsoft Entra ID を検索して選択します。
- [>] をクリックします。
- [名前] を入力し、この組織のディレクトリでのみ [アカウント] を選択します (シングル テナント)。
- [登録] をクリックします。
-
[概要] ページから次の値をコピーします。
- アプリケーション (クライアント) ID
- ディレクトリ (テナント) ID
- [証明書とシークレット>クライアント シークレット>新しいクライアント シークレット] に移動します。
- 説明を追加し、有効期限を設定して、[ 追加] をクリックします。
- クライアント シークレット値をコピーして安全に格納 します。
Azure CLI
詳細な手順については、 Azure CLI を使用した Azure サービス プリンシパルの作成 に関するページを参照してください。
トークンを生成
REST API または Azure CLI を使用してトークンを生成します。 最初に次の情報を収集します。
- テナント ID: Microsoft Entra ID の ディレクトリ (テナント) ID
- クライアント ID: Microsoft Entra ID からの アプリケーション (クライアント) ID
- クライアント シークレット:Microsoft Entra ID からのクライアント シークレット値
REST API メソッド
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 'grant_type=client_credentials' \
-d 'scope=2ff814a6-3304-4ab8-85cb-cd0e6f879c1d%2F.default' \
-d 'client_secret=<client-secret>'
アクセス トークンは、応答の access_token フィールドにあります。
Azure CLI の方法
Azure サブスクリプション ID を取得します。 「ユーザーのトークンを取得する」を参照してください。
サービス プリンシパルでログインします。
az login \ --service-principal \ -t <tenant-id> \ -u <client-id> \ -p <client-secret>正しいサブスクリプションを設定します。
az account set -s <subscription-id>アクセス トークンを生成します。
az account get-access-token \ --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \ --query "accessToken" \ -o tsv
Databricks API でトークンを使用する
トークンを生成した後、それを Databricks REST API と共に使用します。
ワークスペース内のサービス プリンシパル
サービス プリンシパル API または Databricks CLI を使用して、サービス プリンシパルがワークスペースに既に追加されている場合:
Databricks コマンドラインインターフェース (CLI)
databricks clusters list -p <profile-name-with-token>
curl
curl -X GET \
-H 'Authorization: Bearer <access-token>' \
https://<databricks-instance>/api/2.0/clusters/list
Azure ロールを持つサービス プリンシパル
サービス プリンシパルに Azure のワークスペース リソースに対する Contributor ロールまたは Owner ロールがあるが、Azure Databricks ワークスペースにまだ存在しない場合:
Azure Resource Manager の管理トークンを取得します。
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' \ https://login.microsoftonline.com/<tenant-id>/oauth2/token \ -d 'client_id=<client-id>' \ -d 'grant_type=client_credentials' \ -d 'resource=https%3A%2F%2Fmanagement.core.windows.net%2F' \ -d 'client_secret=<client-secret>'両方のトークンを使用して Databricks API を呼び出します。
curl -X GET \ -H 'Authorization: Bearer <databricks-access-token>' \ -H 'X-Databricks-Azure-SP-Management-Token: <management-access-token>' \ -H 'X-Databricks-Azure-Workspace-Resource-Id: /subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Databricks/workspaces/<workspace-name>' \ https://<databricks-instance>/api/2.0/clusters/list
最初の認証後、サービス プリンシパルはワークスペース管理者になります。
更新トークン
アクセス トークンを使用して更新トークンを取得した場合は、それを使用して新しいトークンを取得します。 Microsoft Entra ID アクセス トークンは、既定で 60 分から 90 分後に有効期限が切れます。
次のコードを refresh-tokens.pyとして保存します。
from msal import PublicClientApplication
import sys
client_id = sys.argv[1] if len(sys.argv) > 1 else '<client-id>'
tenant_id = sys.argv[2] if len(sys.argv) > 1 else '<tenant-id>'
refresh_token = sys.argv[3] if len(sys.argv) > 1 else '<refresh-token>'
scopes = ['2ff814a6-3304-4ab8-85cb-cd0e6f879c1d/.default']
app = PublicClientApplication(
client_id=client_id,
authority=f"https://login.microsoftonline.com/{tenant_id}"
)
result = app.acquire_token_by_refresh_token(
refresh_token=refresh_token,
scopes=scopes
)
if 'error' in result:
print(f"Error: {result['error']}")
print(f"Description: {result['error_description']}")
else:
print(f"\nNew access token:\n{result['access_token']}")
print(f"\nNew refresh token:\n{result['refresh_token']}")
スクリプトを実行します。
python refresh-tokens.py <client-id> <tenant-id> <refresh-token>
トークンの問題のトラブルシューティング
このセクションでは、一般的なトークン エラーと、アクセス トークンを検証する方法について説明します。
ユーザー名とパスワードを使用してトークンを取得できませんでした
The user or administrator has not consented to use the application with ID <client-id>.
Send an interactive authorization request for this user and resource.
解決:AzureDatabricks リソースがアプリケーションに追加されていることを確認します。 承認コード フロー (対話型メソッド) を使用して、アクセス許可に同意します。 同意したら、ユーザー名とパスワードのフローを使用できます。 「ユーザーのトークンを取得する」を参照してください。
リダイレクト URI が一致しない
The reply URL specified in the request does not match the reply URLs configured for the application: '<application-id>'
解決: 要求のリダイレクト URI が、アプリケーションで構成されたものと一致するかどうかを確認します。
アクセス トークンを検証する
Microsoft Entra ID アクセス トークンに正しい情報が含まれていることを確認します。 トークンの検証を参照してください。
-
aud:
2ff814a6-3304-4ab8-85cb-cd0e6f879c1d(Databricks リソース ID) -
iss:
https://sts.windows.net/<tenant-id>/ - tid: ワークスペース テナント ID
- nbf/exp: 現在の時刻がこれらの値の間に収まる
- unique_name: ワークスペースにユーザーが存在する
OIDC エンドポイントのパブリック証明書を使用して署名を検証します。
署名検証を使用せずにデコードする:
次のコードは、トークンのペイロードを示しています。 まず、 を使用して pip install pyjwt ライブラリをインストールし、pip install cryptography を使用 して、暗号化ライブラリをインストールする必要があります。
import jwt
def decode_token(token):
algorithm = jwt.get_unverified_header(token)['alg']
decoded = jwt.decode(token, algorithms=[algorithm], options={"verify_signature": False})
for key in decoded.keys():
print(f"{key}: {str(decoded[key])}")
署名検証を使用したデコード:
import jwt
import requests
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend
PEMSTART = '-----BEGIN CERTIFICATE-----\n'
PEMEND = '\n-----END CERTIFICATE-----\n'
def get_public_key_for_token(kid):
response = requests.get('https://login.microsoftonline.com/common/.well-known/openid-configuration').json()
pubkeys = requests.get(response['jwks_uri']).json()['keys']
for key in pubkeys:
if key['kid'] == kid:
cert_str = PEMSTART + str(key['x5c'][0]) + PEMEND
cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
return cert_obj.public_key()
def aad_access_token_decoder(access_token):
header = jwt.get_unverified_header(access_token)
public_key = get_public_key_for_token(header['kid'])
decoded = jwt.decode(access_token, key=public_key, algorithms='RS256',
audience='2ff814a6-3304-4ab8-85cb-cd0e6f879c1d')
for key in decoded.keys():
print(f"{key}: {str(decoded[key])}")