Bagikan melalui


Memecahkan masalah token akses MICROSOFT Entra ID (sebelumnya Azure Active Directory)

Artikel ini menjelaskan cara memecahkan masalah kesalahan yang mungkin Anda temui saat mendapatkan token akses ID Microsoft Entra (sebelumnya Azure Active Directory) dan cara memvalidasi token akses.

Gagal mendapatkan token menggunakan nama pengguna dan kata sandi

Pesan kesalahan

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.

Solution

  1. Jika sumber daya AzureDatabricks tidak ditambahkan ke aplikasi Anda, minta pengguna Admin untuk menambahkannya.
  2. Gunakan metode interaktif untuk mendapatkan token. Halaman web akan memandu Anda untuk memberikan izin ke aplikasi. Atau, klik tombol Berikan izin yang dijelaskan dalam konfigurasi aplikasi. Setelah izin diberikan, Anda dapat menggunakan metode terprogram untuk mendapatkan token.

URL pengalihan tidak cocok

Pesan kesalahan

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

Solution

Periksa apakah URI pengalihan dalam permintaan Anda cocok dengan salah satu yang ada di aplikasi.

Memvalidasi token akses

Saat Anda memiliki token akses ID Microsoft Entra, Anda dapat memverifikasi bahwa token tersebut menyertakan informasi yang benar (lihat memvalidasi token).

Anda harus memverifikasi bahwa bidang berikut cocok dengan catatan:

  • aud: ID sumber daya Azure Databricks: 2ff814a6-3304-4ab8-85cb-cd0e6f879c1d
  • iss: Harus https://sts.windows.net/<tenant-id>/
  • tid: Harus menjadi penyewa ruang kerja (cari ini baik dengan ID organisasi atau ID appliance ruang kerja)
  • nbf/exp: Waktu saat ini harus jatuh di antara nbf dan exp
  • unique_name: Harus menjadi pengguna yang ada di ruang kerja Databricks, kecuali pengguna adalah kontributor pada sumber daya appliance ruang kerja

Validasi tanda tangan token menggunakan sertifikat publik dari titik akhir OIDC.

Berikut adalah cuplikan kode yang menunjukkan payload token. Anda harus terlebih dahulu menginstal pustaka PyJWT menggunakan pip install pyjwt dan pustaka kriptografi menggunakan 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])}")

Jika Anda menginginkan decoding penuh (termasuk verifikasi tanda tangan) dari token, Anda dapat menggunakan cuplikan kode berikut. Anda harus terlebih dahulu menginstal pustaka PyJWT menggunakan pip install pyjwt dan pustaka kriptografi menggunakan pip install cryptography. Selain itu, pastikan untuk mengganti <databricks-resource-id> dalam kode berikut:

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

Berikut adalah contoh keluaran dari cuplikan kode di atas:

Azure registered app settings

Anda juga dapat melihat token yang diterjemahkan melalui dekoder JWT online jika tidak sensitif. Contoh dekoder online adalah jwt.ms dan jwt.io.