次の方法で共有


Microsoft Entra ID トークンを手動で取得する

このページでは、ユーザーとサービス プリンシパルが 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 の方法

  1. ユーザー アカウントの 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-ws
      

      00000000-0000-0000-0000-000000000000後の/subscriptions/は、サブスクリプション ID です。

      テナント エラーが発生した場合は、正しいテナントにサインインします。

      az login -t <tenant-id>
      

      Azure portal でサブスクリプション ID とテナント ID を取得するを参照してください。

  2. Azure にサインインします。

    az login
    
  3. 正しいサブスクリプションを設定します。

    az account set -s <subscription-id>
    
  4. アクセス トークンを生成します。

    az account get-access-token \
    --resource 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d \
    --query "accessToken" \
    -o tsv
    

    2ff814a6-3304-4ab8-85cb-cd0e6f879c1dリソース ID は、すべての Azure 環境における Azure Databricks の標準識別子です。

MSAL メソッド

Microsoft 認証ライブラリ (MSAL) を使用して、プログラムによって Microsoft Entra ID アクセス トークンを取得します。 MSAL では、次の 2 つのフローがサポートされています。

  • 承認コード フロー (対話型): ユーザー サインイン用のブラウザーを起動します。 これは、2 要素認証またはフェデレーション認証が有効になっている場合、または管理者の同意が必要な場合に使用します。
  • ユーザー名とパスワードのフロー (プログラム): ユーザー名とパスワードを使用して認証します。 これは、プログラムでサインインする権限がある場合にのみ使用します。

MSAL を使用する前に、Microsoft Entra ID でアプリケーションを登録する必要があります。 Azure portal を使用したアプリの登録に関するページを参照してください。 登録時:

  1. [サポートされているアカウントの種類] を[この組織のディレクトリ内のアカウントのみ (シングル テナント)]に設定します。
  2. リダイレクト URIパブリック クライアント/ネイティブ (モバイルおよびデスクトップ)http://localhost設定します。
  3. アプリの [概要] ページから、アプリケーション (クライアント) IDディレクトリ (テナント) ID をメモします。
  4. AzureDatabricks API アクセス許可を追加します。
    1. API のアクセス許可に移動します>アクセス許可を追加します
    2. AzureDatabricks を検索して選択します。
    3. user_impersonationを有効にし、[アクセス許可の追加] をクリックします。
    4. [ 管理者の同意を付与する (管理者特権が必要)] をクリックします。

承認コード フロー

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

  1. Azure portal にサインインします。
  2. 必要に応じて、 ディレクトリとサブスクリプション を使用して適切なテナントに切り替えます。
  3. Microsoft Entra ID を検索して選択します。
  4. [>] をクリックします。
  5. [名前] を入力し、この組織のディレクトリでのみ [アカウント] を選択します (シングル テナント)。
  6. [登録] をクリックします。
  7. [概要] ページから次の値をコピーします。
    • アプリケーション (クライアント) ID
    • ディレクトリ (テナント) ID
  8. [証明書とシークレット>クライアント シークレット>新しいクライアント シークレット] に移動します。
  9. 説明を追加し、有効期限を設定して、[ 追加] をクリックします。
  10. クライアント シークレット値をコピーして安全に格納 します

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 の方法

  1. Azure サブスクリプション ID を取得します。 「ユーザーのトークンを取得する」を参照してください。

  2. サービス プリンシパルでログインします。

    az login \
    --service-principal \
    -t <tenant-id> \
    -u <client-id> \
    -p <client-secret>
    
  3. 正しいサブスクリプションを設定します。

    az account set -s <subscription-id>
    
  4. アクセス トークンを生成します。

    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 ワークスペースにまだ存在しない場合:

  1. 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>'
    
  2. 両方のトークンを使用して 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])}")

非機密性トークンには、jwt.msjwt.io などのオンライン JWT デコーダーを使用します。