Microsoft Entra Id erişim belirteçleriyle ilgili sorunları giderme

Bu makalede, Microsoft Entra ID erişim belirteçlerini alırken karşılaşabileceğiniz hataları giderme ve erişim belirteçlerini doğrulama işlemleri açıklanmaktadır.

Kullanıcı adı ve parola kullanılarak belirteç alınamadı

Hata İletisi

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.

Çözüm

  1. AzureDatabricks kaynağı uygulamanıza eklenmiyorsa Yönetici kullanıcıdan bunu eklemesini isteyin.
  2. Belirteci almak için etkileşimli yöntemi kullanın. Web sayfası, uygulamaya izinler verme konusunda size yol gösterir. Alternatif olarak, uygulama yapılandırmasında açıklanan İzin ver düğmesine tıklayın. İzinler verildikten sonra, belirteci almak için programlama yöntemini kullanabilirsiniz.

Yeniden yönlendirme URI'leri eşleşmiyor

Hata İletisi

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

Çözüm

İsteğinizdeki yeniden yönlendirme URI'sinin uygulamadakilerden biriyle eşleşerek eşleşmediğini denetleyin.

Erişim belirtecini doğrulama

Microsoft Entra ID erişim belirtecinin doğru bilgileri içerdiğini doğrulayabilirsiniz (bkz . belirteçleri doğrulama).

Aşağıdaki alanların kayıtla eşleştiklerini doğrulamanız gerekir:

  • aud: Azure Databricks kaynak kimliği: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: Olmalıdır https://sts.windows.net/<tenant-id>/
  • tid: Çalışma alanının kiracısı olmalıdır (bunu kuruluş kimliğine veya çalışma alanı gereci kimliğine göre arayın)
  • nbf/exp: Geçerli saat ve arasında nbf olmalıdır exp
  • unique_name: Kullanıcı çalışma alanı gereci kaynağında katkıda bulunan değilse Databricks çalışma alanında bulunan bir kullanıcı olmalıdır

OIDC uç noktalarındaki genel sertifikaları kullanarak belirtecin imzasını doğrulayın.

Burada belirtecin yükünü gösteren bir kod parçacığı yer alır. Önce kullanarak PyJWT kitaplığını pip install pyjwt ve kullanarak pip install cryptographyşifreleme kitaplığını yüklemeniz gerekir:

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])}")

Belirtecin tam kodunun çözülmesini (imza doğrulaması dahil) istiyorsanız aşağıdaki kod parçacığını kullanabilirsiniz. Önce kullanarak PyJWT kitaplığını pip install pyjwt ve kullanarak pip install cryptographyşifreleme kitaplığını yüklemeniz gerekir. Ayrıca, aşağıdaki kodu değiştirdiğinden <databricks-resource-id> emin olun:

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])}")

Yukarıdaki kod parçacığından alınan çıktının bir örneği aşağıda verilmiştir:

Azure kayıtlı uygulama ayarları

Kodu çözülen belirteci, hassas olmayan çevrimiçi JWT kod çözücüleri aracılığıyla da görüntüleyebilirsiniz. Çevrimiçi kod çözücülere örnek olarak jwt.ms ve jwt.io verilebilir.