次の方法で共有


Microsoft Entra ID アクセス トークンのトラブルシューティング

この記事では、Microsoft Entra ID アクセス トークンを取得するときに発生する可能性があるエラーのトラブルシューティングの方法と、アクセス トークンの検証方法について説明します。

ユーザー名とパスワードを使用してもトークンを取得できない

エラー メッセージ

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.

解決策

  1. AzureDatabricks リソースがアプリケーションに追加されていない場合は、管理者ユーザーに追加してもらいます。
  2. 対話型メソッドを使用してトークンを取得します。 Web ページには、アプリケーションにアクセス許可を付与する方法が説明されています。 または、アプリケーション構成の説明にある [アクセス許可の付与] ボタンをクリックします。 アクセス許可が付与された後、プログラム メソッドを使用してトークンを取得できます。

リダイレクト URI が一致しない

エラー メッセージ

The reply url specified in the request does not match the reply urls configured for the application: '<application-id>'

解決策

要求のリダイレクト URI は、アプリケーション内のリダイレクト URI と一致している必要があります。

アクセス トークンを検証する

Microsoft Entra ID のアクセス トークンがある場合は、適切な情報が含まれていることを確認できます (トークンの検証に関するページを参照)。

次のフィールドがレコードと一致している必要があります。

  • aud: Azure Databricksリソース ID: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: https://sts.windows.net/<tenant-id>/である必要があります
  • tid: ワークスペースのテナントである必要があります (組織 ID またはワークスペース アプライアンス ID で検索します)
  • nbf/exp: 現在の時刻は nbfexp の間である必要があります
  • unique_name: ワークスペース アプライアンス リソースの共同作成者でない場合、Databricks ワークスペースに存在するユーザーである必要があります

OIDC エンドポイントのパブリック証明書を使用して、トークンの署名を検証します。

トークンのペイロードを示すコード スニペットを次に示します。 まず、pip install pyjwt を使用して 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])}")

トークンの完全なデコード (署名検証を含む) が必要な場合は、次のコード スニペットを使用できます。 まず、pip install pyjwt を使用して PyJWT ライブラリをインストールし、pip install cryptography を使用 して、暗号化ライブラリをインストールする必要があります。 また、次のコードの <databricks-resource-id> を必ず置き換えてください。

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'

# Get the Microsoft Azure public key.
def get_public_key_for_token(kid):
  response = requests.get(
    'https://login.microsoftonline.com/common/.well-known/openid-configuration',
  ).json()

  jwt_uri = response['jwks_uri']
  response_keys = requests.get(jwt_uri).json()
  pubkeys = response_keys['keys']

  public_key = ''

  for key in pubkeys:
    # Find the key that matches the kid in the token's header.
      if key['kid'] == kid:
        # Construct the public key object.
        mspubkey = str(key['x5c'][0])
        cert_str = PEMSTART + mspubkey + PEMEND
        cert_obj = load_pem_x509_certificate(bytes(cert_str, 'ascii'), default_backend())
        public_key = cert_obj.public_key()

  return public_key

# Decode the given <ms-entra-id> token.
def aad_access_token_decoder(access_token):
  header = jwt.get_unverified_header(access_token)
  public_key = get_public_key_for_token(header['kid'])
  # The value of the databricks_resource_id is as defined previously,
  # for example, databricks_resource_id = "2ff814a6-3304-4ab8-85cb-cd0e6f879c1d"
  decoded = jwt.decode(
    access_token,
    key = public_key,
    algorithms = 'RS256',
    audience = '<databricks-resource-id>')

  for key in decoded.keys():
    print(f"{key}: {str(decoded[key])}")

上記のコード スニペットからの出力の例を次に示します。

Azure 登録済みアプリの設定

また、機密性が高くない場合は、オンライン JWT デコーダーを介してデコードされたトークンを表示できます。 オンライン デコーダーには、jwt.msjwt.io などがあります。